我有一个包含以下内容的CSV文件:
A,B,C
D,"E,F",G
H,I,"J,K,L"
我需要在引号之间删除逗号(也删除引号,但这不是那么重要):
A,B,C
D,EF,G
H,I,JKL
我查看了PoSh -replace
运算符但我无法捕获多个组值:
PS >"D,`"E,F`",G" -replace "`"((?:[^,`"]+)\,?)+`"", '$1'
D,F,G
正如您可以看到重复组时,只保留最后捕获的值。有没有办法进行我想要的转换?
答案 0 :(得分:3)
您可以定义一个回调以传递到Regex::Replace
方法,您可以在其中抓取引号之间的部分并删除那里的所有,
:
$callback = { param($match) $match.Groups[1].Value.Replace(',','') }
$s = "D,`"E,F`",G"
$rex = [regex]'"([^"]*)"'
$rex.Replace($s, $callback)
正则表达式"([^"]*)"
匹配"
,然后捕获到第1组(即$match.Groups[1].Value
)除"
以外的任何零个或多个字符,然后匹配{{ 1}}。如果您有转义报价,它将需要增强,但方法将是相同的。
答案 1 :(得分:2)
这是使用正则表达式的替代方法:
Import-Csv your.csv | Foreach-Object {
$_.PSObject.Properties | ForEach-Object { $_.Value = $_.Value -replace ',' }
$_
} | Export-csv your-new.csv -NoTypeInformation
我们使用Import-CSV
将数据导入为PowerShell对象。然后,我们遍历CSV的每一行的每个属性的值,以替换“,”字符。然后我们将其导出为新的CSV。