【问题标题】:Replace commas that are not within double inverted commas("") from csv files using powershell?使用powershell替换csv文件中不在双引号(“”)中的逗号?
【发布时间】:2014-12-06 12:00:05
【问题描述】:

我有一个巨大的 csv 文件(大约 100GB)。我的问题是我需要用分号(;)替换文件中的逗号(,),除了双反逗号(“”)中的逗号。

我尝试了几种方法,但似乎都没有奏效。此外,此修改需要在 Windows 上进行,因此 sed 和 awk 不可用。

例子:
输入:"A,B,C",D,E,"FG","H,J",K
输出:"A,B,C";D;R;"FG";H,J;K

完成后,我需要删除“。

我可以从文件中删除 ",但分号替换每次都失败。

请让我知道这是否可以通过 Powershell 实现。

【问题讨论】:

  • 100 GB csv?我不会相信的
  • 您的示例似乎是错误的。请修复它。
  • 为什么sedawk 是不可能的? unxutils.sourceforge.net
  • 如果sed和awk能用就太好了。但该文件在 Windows 机器中,而不是在 Linux 中。
  • 你不应该这样做。使用支持 CSV 文件的编程语言。以逗号分隔的文件形式读入您的文件,然后以不带引号的 ;-分隔文件的形式将其写出(除非不需要保护内容中的分号)。

标签: regex windows powershell csv


【解决方案1】:

这应该同时处理分隔符替换和删除双引号:

 Get-Content ./File.csv -ReadCount 1000 |
 foreach { $_ -replace ',(?=(?:[^"]|"[^"]*")*$)',';' -replace '"' } |
 Add-Content ./NewFile.csv 

无需第三方实用程序即可高效处理大型文件。

【讨论】:

  • 如果字段未包含在“”中,则代码不起作用。例如: "A,B",C,D,"E" 返回 A,B;C,D;E"
  • 我可以很容易地处理尾随的 " (请参阅更新的答案)。如果这不是您想要的,那么我误解了您删除 " 的意思。最终输出究竟应该是什么样子?
  • 我很抱歉。帖子中最初标记为重复的正则表达式确实有效stackoverflow.com/questions/632475/…(您应该对此表示赞同),但是您想要做的 powershell 实现与在 unix 实用程序中使用它不同。我已经更新了答案。
  • 非常感谢!完美运行。有什么办法可以提高性能吗?更改 readcount 值似乎没有太大区别。
猜你喜欢
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2016-03-18
  • 2017-09-28
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多