我有一个以逗号分隔的CSV文件,但每行中的最后一个字段都是双引号,并且可能在引号中包含逗号。我需要将所有逗号替换为管道(like | )
除了每行末尾的引用字段中的那些逗号。
文件中的一行示例:
2,1,24,Bourne,Jason,,06-01-1973,M,Ned,,Grove,,College Rd,72,1,01-10-2012,Null,85,S,"notes go here, and may contain commas."
我运行了以下Powershell脚本,但发现它甚至替换了行尾的引号中的逗号:
(Get-Content c:\input.csv)
| % {$_ -replace ',', "|"}
| out-file -FilePath c:\output.csv -Force -Encoding ascii
我已经苦苦挣扎了几个小时,现在试图用一个正则表达式来代替前19个逗号,但到目前为止还没有太大的成功。我对正则表达式的体验非常有限,所以这对我来说是一次学习经历。非常感谢任何帮助!
答案 0 :(得分:2)
我想说不要打扰正则表达式,只需使用powershell导入/导出csv功能。 export-csv
命令允许您选择分隔符:
import-csv C:\Input.csv | export-csv -Delimiter "|" -path c:\updated.csv
答案 1 :(得分:0)
通过RegEx运行它以将其拆分为最后一个字段,并在第一部分上执行替换,如下所示:
GC C:\Input.csv |?{$_ -match "(.*?)(`"[^`"]*?`")"}|%{"$($Matches[1].replace(",","|"))$($Matches[2])"}| out-file -FilePath c:\output.csv -Force -Encoding ascii
答案 2 :(得分:0)
另一种选择是分裂,"然后在第一个元素中执行替换,然后使用|"
重新加入$text =
'2,1,24,Bourne,Jason,,06-01-1973,M,Ned,,Grove,,College Rd,72,1,01-10-2012,Null,85,S,"notes go here, and may contain commas."'
($text -split ',"')[0].Replace(',','|'),($text -split ',"')[1] -join '|"'
2|1|24|Bourne|Jason||06-01-1973|M|Ned||Grove||College Rd|72|1|01-10-2012|Null|85|S|"notes go here, and may contain commas."
或者只是将其拆分为引号,然后使用格式字符串重新组合:
'{0}"{1}"' -f $text.split('"')[0].replace(',','|'),$text.split('"')[1]
2|1|24|Bourne|Jason||06-01-1973|M|Ned||Grove||College Rd|72|1|01-10-2012|Null|85|S|"notes go here, and may contain commas."