从CSV文件的字符串列中删除新行字符

时间:2013-09-04 17:11:18

标签: powershell csv

我有一个带有字符串列的CSV文件,该列跨越多行。我想将这些多行聚合成一行。

例如

1, "asdsdsdsds", "John"
2, "dfdhifdkinf
dfjdfgkdnjgknkdjgndkng
dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"

我希望我的输出

1, "asdsdsdsds", "John"
2, "dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"

我想使用PowerShell

实现此输出

感谢。

4 个答案:

答案 0 :(得分:3)

试试这个:

$csv = 'C:\path\to\your.csv'

(Import-Csv $csv -Header 'ID','Value','Name') | % {
  $_.Value = $_.Value -replace "`r`n",' '
  $_
} | Export-Csv $csv -NoTypeInformation

如果您的CSV包含标题,请从导入中删除-Header 'ID','Value','Name',并将Value替换为实际的列名称。

如果您不想在字段周围使用双引号,则可以通过将Export-Csv替换为以下内容来删除它们:

... | ConvertTo-Csv -NoTypeInformation | % { $_ -replace '"' } | Out-File $csv

要从输出中删除标题,请在Out-File之前添加另一个过滤器以跳过第一行:

... | select -Skip 1 | Out-File $csv

答案 1 :(得分:2)

在Ansgar的答案的基础上,以下是如何做到这一点:

  • 您不知道列名称
  • 您的CSV文件可能包含CR或LF

    (Import-Csv $csvInput) | % {
        $line = $_
        foreach ($prop in $line.PSObject.Properties) {
            $line.($prop.Name) = ($prop.Value -replace '[\r\n]',' ')
        }
        $line
    } | Export-Csv $csvOutput -NoTypeInformation
    

答案 2 :(得分:1)

您可以导入csv,执行专门的选择,并将结果写入新的CSV。

import-csv Before.csv -Header "ID","Change" | Select ID,@{Name="NoNewLines", Expression={$_.Change -replace "`n"," "}} | export-csv After.csv

关键部分在select语句中,它允许您传递专用的哈希表(Name是属性的名称,Expression是计算它的脚本块)。

您可能需要稍微调整标题以获得所需的确切输出。

答案 3 :(得分:0)

Export-CSV的问题有两个:

  • 早期版本(powershell1& 2)不允许您将数据附加到CSV
  • 如果传送给它的数据包含换行符,则数据在Excel中无用

上述两种解决方案都是使用Convertto-CSV代替。这是一个示例:

{bunch of stuff} | ConvertTo-CSV | %{$_ -replace "`n","<NL>"} | %{$_ -replace "`r","<CR>"} >>$AppendFile

请注意,这允许您对数据进行任何编辑(在这种情况下,替换换行数据),并使用重定向来追加。