使用PowerShell导入和导出CSV,所有列都用双引号括起来

时间:2017-07-10 12:24:14

标签: powershell csv

我使用以下代码导入和导出到CSV。我进行导出的原因是因为我需要将导出的CSV中的所有列都用双引号括起来。但是使用下面的代码,双引号只出现在每行的第一行和最后一行。

Import-Csv c:\Emp.csv | Export-Csv c:\Emp1.csv -NoTypeInformation -Force

请注意,我已经尝试过以下代码(如果CSV的大小> 200MB,则可以使用但需要更长的时间):

$inform = Get-Content C:\A.csv 
$inform | % { 
  $info = $_.ToString().Replace("|", """|""") 
  $info += """" 
  $var = """" + $info 
  $var | Out-File D:\B.csv -Append 
}

示例输入(CSV文件):

1|A|Test|ABC,PQR

示例输出(CSV文件):

"1"|"A"|"Test"|"ABC,PQR"

1 个答案:

答案 0 :(得分:1)

Export-Csv已经在每个字段周围添加了双引号,因此您需要做的就是指示它使用正确的分隔符:

Import-Csv 'C:\path\to\input.csv' -Delimiter '|' |
    Export-Csv 'C:\path\to\output.csv' -Delimiter '|' -NoType

但是,Export-Csv不加选择地在所有字段周围添加引号,因此如果您想有选择地在特定字段周围添加引号,则需要自定义例程:

$reader = New-Object IO.StreamReader 'C:\path\to\input.csv'
$writer = New-Object IO.StreamWriter 'C:\path\to\output.csv'

while ($reader.Peek() -ge 0) {
    $line = $reader.ReadLine().Split('|')
    for ($i=0; $i -lt $line.Count; $i++) {
        if ($line[$i] -like '*,*') {
            $line[$i] = '"{0}"' -f $line[$i]
        }
    }
    $writer.WriteLine(($line -join '|'))
}

$reader.Close(); $reader.Dispose()
$writer.Close(); $writer.Dispose()