【问题标题】:Powershell regex to remove comma but not delimiterPowershell正则表达式删除逗号但不分隔符
【发布时间】:2016-12-12 15:39:48
【问题描述】:

我将带分隔符的 CSV 带入 PowerShell 以使用下面的代码删除换行符,但我发现我还需要删除额外的逗号,但不确定如何格式化正则表达式。

(Get-Content -Path $fullpath -Raw) -replace '(?<!\x0d)\x0a'," " | out-file $fullpath

我的输入 CSV 是:

"field1","field2","field3","fred,mary,john,brian","field5"

所以我想保留","(包括引号),但自己删除任何其他逗号。

所以我最终会得到:

"field1","field2","field3","fred mary john brian","field5"

【问题讨论】:

  • 为什么是正则表达式?您有一个有效的 CSV。如果您确实需要删除逗号 Import-Csv,请选择字段并重写它们。
  • @Calzor:假设您的意思是样本是有效的 CSV,我将尾随引号添加到 "field3"。欢迎来到 SO!
  • 问题是 csv 在 excel 中是“链接的”,它解释了换行符和额外的逗号把它弄乱了。我更容易通过 powershell 在导入时修复源

标签: regex csv powershell


【解决方案1】:

这样就可以了。

(Get-Content -Path $fullpath -Raw) -replace '(?<!"),|,(?!")',' ' | out-file $fullpath

它只会匹配没有以引号开头或后面没有引号的逗号。
除引号外的所有逗号都是如此:","

要仅删除特定字段的逗号,您可以将 Import-Csv 与 Header 一起使用。

$csvin = Import-Csv -Path $fullpath -Header f1,f2,f3,f4,f5
$csvin |%{$_.f4=$_.f4.replace(',',' ')}
$csvin |ConvertTo-Csv -NoTypeInformation |Select-Object -Skip 1 |Set-Content -Path $fullpath

【讨论】:

  • 您的正则表达式解决方案假定带引号的字段永远不会以逗号开头或结尾。
  • 修复了正则表达式。现在它还将删除引号之间的最后一个和第一个逗号。即使您的字段彼此相邻。
【解决方案2】:

您可以导入 CSV 文件,从所有字段中删除逗号,然后再次将其写入 CSV。无需尝试编写保持结构完整的正则表达式:

$data = Import-Csv foo.csv
$columns = $data | gm | where MemberType -eq NoteProperty | % Name
$newdata = $data | %{
  foreach ($c in $columns) {
    $_.$c = $_.$c -replace ',',' '
  }
}
$newdata | Export-Csv foo-rewritten.csv

【讨论】:

  • ++,但始终值得指出的是,Export-Csv 默认使用 ASCII 编码(!),因此建议始终使用 -Encoding 参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
相关资源
最近更新 更多