【问题标题】:How to Parse the multi value comma delimited file如何解析多值逗号分隔文件
【发布时间】:2016-06-22 04:53:36
【问题描述】:

我有一个逗号分隔的文件,它有 6 个字段,而我们收到了逗号作为字段的值,并用“”括起来。我必须用 hiphen 替换那个逗号。

输入为

03/03/2016,Customer Service,CHAT,"Responded, closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded, awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31

预期输出为

03/03/2016,Customer Service,CHAT,"Responded- closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded- awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31

【问题讨论】:

  • 使用具有适当 CSV 解析器的语言。大多数 shell 工具都使用正则表达式,这不足以识别有效的 CSV 文件。

标签: shell unix awk sh ksh


【解决方案1】:

在 gnu-awk 中使用 FPAT 你可以这样做:

awk -v FPAT='"[^"]+"|[^,]+' -v OFS=, '{for(i=1; i<=NF; i++) gsub(/,/, "-", $i)} 1' file.csv
03/03/2016,Customer Service,CHAT,"Responded- closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded- awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31

使用sed 你可以这样做:

sed -E ':a; s/("[^,"]+),([^"]*")/\1-\2/g; ta;' file.csv
03/03/2016,Customer Service,CHAT,"Responded- closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded- awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31

【讨论】:

  • ++ 用于 AWK 解决方案
  • 由于我没有使用 gnu-awk,所以命令返回的输出如下 $ awk -v FPAT='"[^"]+"|[^,]+' -v OFS=, '{for(i=1; i
  • FPAT 仅在 gnu-awk 中受支持,因此它不适用于较旧的 awk 版本。试试我建议的sed 命令
  • gawk -v FPAT='"[^"]+"|[^,]+' -v OFS=, '{for(i=1; i
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 2010-11-29
  • 2013-09-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多