CSV字段首尾空格去除:PowerShell脚本失效及无引号输出诉求
解决CSV字段首尾空格去除及无引号输出问题
平时维护数千行Excel转成的CSV,要通过BCP导入数据库,但CSV字段存在首尾空格(字段内的空格是合法的),不想在SQL里写一大堆LTRIM(RTRIM(fieldname)),也不想手动处理Excel,想用PowerShell脚本搞定,这里分两个问题说清楚:
一、最初的替换脚本为啥没生效?
你一开始用的脚本是这样的:
(Get-Content .\file.csv) | foreach { $_ -replace '"\s+|\s+"','"' } | Out-File .\file.csv
问题出在正则表达式上——这个正则是匹配双引号前后的空格,但你的原CSV里根本没有双引号!比如你的CSV行是:
1,1 , 1 ,1
所有字段都是裸值,没加双引号包裹,所以"\s+|\s+"(等价于"\s+|\s+")根本找不到任何匹配内容,自然不会做任何替换,空格当然还留着。
二、用面向对象方案后,怎么输出不带引号的CSV?
你用的Santiago Squarzon的面向对象方案确实能正确去掉每个字段的首尾空格,但Export-Csv这个cmdlet默认会给字段加双引号(这是CSV的标准行为,防止字段里的逗号等特殊字符破坏格式)。如果一定要输出不带引号的CSV,别用Export-Csv,手动拼接每行内容就行:
修改后的脚本:
# 读取CSV并处理每个字段的首尾空格 $processedData = Import-Csv .\file.csv | ForEach-Object { foreach($property in $_.PSObject.Properties) { $property.Value = $property.Value.Trim() } $_ } # 提取表头,用逗号拼接 $header = $processedData[0].PSObject.Properties.Name -join ',' # 把每行数据的字段值用逗号拼接成字符串 $dataRows = $processedData | ForEach-Object { $_.PSObject.Properties.Value -join ',' } # 把表头和数据行合并后写入文件 @($header) + $dataRows | Out-File .\file_no_quotes.csv -Encoding utf8
这样生成的CSV就没有双引号了,而且字段首尾空格已经被去掉,字段内的空格(比如red clover里的空格)会保留。
⚠️ 注意:如果你的字段值里本身包含逗号,这种无引号的格式会导致CSV解析错误——这也是Export-Csv默认加引号的原因。如果你的数据里没有带逗号的字段,上面的脚本完全没问题;如果有,建议还是保留引号,不然BCP导入时会识别出错。
内容的提问来源于stack exchange,提问作者knot22
相关产品推荐
相关产品推荐

