Powershell脚本可替换每行中的特定数量的逗号

时间:2014-05-16 16:57:08

标签: regex powershell csv

我有一个以逗号分隔的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个逗号,但到目前为止还没有太大的成功。我对正则表达式的体验非常有限,所以这对我来说是一次学习经历。非常感谢任何帮助!

3 个答案:

答案 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."