【问题标题】:Strip variable number of commas from double-quoted csv field从双引号 csv 字段中去除可变数量的逗号
【发布时间】:2018-10-25 13:15:01
【问题描述】:

如何编写 sed 脚本(或 awk,只是不熟悉它)从双引号 csv 字段的内部删除逗号?我可以使用以下 sed one-liner 删除单个逗号:

sed 's/"\([^"]*\),\([^"]*\)"/\1\2/g' file > file2

但如果我在字段中有两个逗号,则只去掉一个逗号:

“ALOHA, INC., A CONDOMINIUM ASSOCIATION”

变成

“ALOHA, INC. A CONDOMINIUM ASSOCIATION”

或者,如果有人可以向我解释为什么在将 csv 加载到 mysql 时,我似乎无法获得“可选地被封闭”选项,那会让生活变得更轻松(我已经一直在尝试使用 sed 去除逗号,因为即使我使用可选包含的选项并且我的字段被双引号引起来,逗号也会破坏我的列数据。Excel 仅在带逗号的字段周围使用引号导出。如果所有内容都是双引号,我不会没问题,但有选择性地引用,我开始在桌子上敲我的鞋子。

更新:该文件包含多个字段。

“ALOHA, INC., A CONDOMINIUM ASSOCIATION”, 900, VENICE, FL, 34293-5112,,VENICE,FL,34285,ALOHA

我什至担心可能存在包含多个引用字段的行,这似乎是一个严重的问题。不过据我所知,这并不常见。

我刚才在想的一件事是我可以消除“,INC”的所有实例,但这不会消除其他例子,例如“,LLC”等。

我想删除字段中的所有逗号。

我担心以下情况:

“ALOHA, INC., A CONDOMINIUM ASSOCIATION”, 900, VENICE, FL, 34293-5112,,VENICE,FL,34285,”ALOHA, Inc., A CONDOMINIUM ASSOCIATION”

Aloha 的第一个实例和最后一个实例之间的逗号不会用

消除吗
sed 's/"\([^"]*\),\([^"]*\)"/\1\2/g' file > file2

【问题讨论】:

  • 试试sed '/"[^"]*"/s/,//g' file > file2
  • @malan,您的线路是只有一个字段还是多个字段?提供一个反映您真实用例的示例很重要.. 或者假设一行中只有一个双引号字段,您可能会得到答案..
  • 另外,您能否澄清一下应该如何处理带有 1 个逗号、3 个逗号、4 个逗号等的双引号字段...您给定的示例适用于您想要的带有 2 个逗号的字段删除第二个逗号..
  • Sundeep:如果一行中有 2 个双引号字段,它会消除分隔逗号的字段吗?我正在考虑基于 sed 和正则表达式。
  • 要保留双引号还是去掉它们?

标签: mysql regex csv sed


【解决方案1】:

您可以在这种情况下使用 GNU awk

$ gawk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{for(i=1; i<=NF; i++) gsub(/,/, "", $i)} 1' ip.txt
"ALOHA INC. A CONDOMINIUM ASSOCIATION", 900, VENICE, FL, 34293-5112,,VENICE,FL,34285,"ALOHA Inc. A CONDOMINIUM ASSOCIATION"

如果gawk不可用,可以使用

perl -pe 's/"[^"]+"/$&=~tr|,||dr/ge' ip.txt

注意:如果字段包含双引号、换行符等,这将不起作用。请使用 perl、python 等中提供的 csv 解析器

【讨论】:

  • 谢谢桑迪普。这是一个非常强烈的提醒,我需要学习 awk。
【解决方案2】:

如果您想删除所有出现在 " 到 " 之间的逗号,那么以下内容可能会对您有所帮助。

sed '/".*"/s/,//g'   Input_file

如果您想将输出保存到 Input_file 本身,请使用 sed -i 选项。

【讨论】:

  • OP 提到从带有两个逗号的字段中删除一个逗号.. 虽然不是很清楚..
  • @Sundeep 如果“我想从一个字段中删除所有逗号”你不明白哪一部分?
  • @EJP 不理解 OP 的措辞并与示例混淆(认为给出了预期的输出)。remove all commas 已添加到编辑中
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多