PowerShell正则处理:如何仅去除CSV多余引号保留必要引号?
解决ConvertTo-Csv导致的多余双引号问题
我懂你的困扰——SQL查询已经给字符串字段加了必要的引号,结果经过ConvertTo-Csv处理后,原来的引号被转义成成对的双引号,输出格式变得乱糟糟的。别担心,只需要调整替换逻辑就能轻松搞定。
先看修改后的完整脚本:
Invoke-Sqlcmd -ServerInstance SQLSrv01 ` -Database MyDatabase ` -InputFile "c:\temp\MyQuery.sql" | ` ConvertTo-Csv -NoTypeInformation -Delimiter "," | ` Select-Object -Skip 1 | ` ForEach-Object { $_ -replace '""', '"' } | ` Out-File "C:\temp\test.csv" -Force -Encoding UTF8
关键修改点说明:
- 你原来脚本里的
% {$_ -replace '', ""}是无效操作,我们把它替换成了ForEach-Object { $_ -replace '""', '"' }。 - 原因很直接:ConvertTo-Csv遵循CSV规范,会把字段内部的双引号转义为两个连续的双引号(
"")。我们的替换逻辑就是把这些转义后的双引号还原成单个双引号("),这样既保留了每个字段外围的必要引号,又去掉了多余的转义引号。
举个实际转换的例子:
- SQL输出的原始字段:
"George Burns" - 经过ConvertTo-Csv处理后:
"""George Burns"""(对应你看到的""George Burns"",属于显示层面的小差异) - 替换后最终效果:
"George Burns",完全符合你的需求。
如果之后遇到更复杂的CSV场景(比如字段包含逗号、换行符),这个替换逻辑依然适用,因为它只针对CSV规范里的转义双引号处理,不会破坏字段的整体结构。
内容的提问来源于stack exchange,提问作者Björn H. Sandvik
相关产品推荐
相关产品推荐

