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

使用PowerShell导入和导出CSV,所有列都用双引号括起来,powershell,csv,Powershell,Csv,我使用下面的代码导入和导出到CSV。我之所以要进行导出,是因为我需要导出的CSV中的所有列都用双引号括起来。但在下面的代码中,双引号仅出现在每行的第一行和最后一行 Import-Csv c:\Emp.csv | Export-Csv c:\Emp1.csv -NoTypeInformation -Force 请注意,我已经尝试了以下代码(如果CSV的大小大于200MB,则需要更长的时间): 示例输入(CSV文件): 1 | A |测试| ABC,PQR 示例输出(CSV文件): “1”|“A”

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

Import-Csv c:\Emp.csv | Export-Csv c:\Emp1.csv -NoTypeInformation -Force
请注意,我已经尝试了以下代码(如果CSV的大小大于200MB,则需要更长的时间):

示例输入(CSV文件):

1 | A |测试| ABC,PQR 示例输出(CSV文件):

“1”|“A”|“测试”|“ABC,PQR”
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()

请为每段代码发布示例输入和输出。这一要求的理由是什么?AFAIK PowerShell如下所示,因此只有在需要时才会用引号括起来(即值具有特殊字符)。事实上,将整行放在双引号中,如下所示:“1 | A | Test | ABC,PQR”
导出Csv
已经满足了您的要求,但您正在使用自定义分隔符(
),因此,对于
导入Csv
导出Csv
,您需要将其指定为
-分隔符“|”
。这很有效!抢手货谢谢。@AnsgarWiechers导出Csv确实解决了我的问题,但我有巨大的Csv文件,当Csv文件中的所有列都用双引号括起来后,这些文件变得更大。我们是否可以调整它,使其仅为具有逗号输入的列加上双引号:
1 | 2 | ABC,PQR
Output
1 | 2 |“ABC,PQR”
"1"|"A"|"Test"|"ABC,PQR"
Import-Csv 'C:\path\to\input.csv' -Delimiter '|' |
    Export-Csv 'C:\path\to\output.csv' -Delimiter '|' -NoType
$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()