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

Jos*_*eph 2 csv powershell

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

Import-Csv c:\Emp.csv | Export-Csv c:\Emp1.csv -NoTypeInformation -Force
Run Code Online (Sandbox Code Playgroud)

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

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

输入示例(CSV 文件):

1|A|测试|ABC、PQR

示例输出(CSV 文件):

“1”|“A”|“测试”|“ABC,PQR”

Ans*_*ers 5

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

Import-Csv 'C:\path\to\input.csv' -Delimiter '|' |
    Export-Csv 'C:\path\to\output.csv' -Delimiter '|' -NoType
Run Code Online (Sandbox Code Playgroud)

但是,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()
Run Code Online (Sandbox Code Playgroud)