【发布时间】:2016-02-15 03:58:08
【问题描述】:
我正在处理一个类似下面的 csv 文件,以逗号分隔,每个单元格都用双引号括起来,但其中一些包含双引号和/或双引号内的逗号。实际文件包含大约 300 列和 200,000 行。
"Column1","Column2","Column3","Column4","Column5","Column6","Column7"
"abc","abc","this, but with "comma" and a quote","18"" inch TV","abc","abc","abc"
"cde","cde","cde","some other, "cde" here","cde","cde","cde"
我需要删除一些除非列,并合并最后几列,而不是在它们之间添加",",我需要</br>。并将第二列移动到最后。单元格内的任何内容都应该相同,双引号和逗号作为原始文件。下面是我需要的输出示例。
"Column1","Column4","Column5","Column2"
"abc","18"" inch TV","abc</br>abc</br>abc","abc"
"cde","some other, "cde" here","cde</br>cde</br>cde","cde"
在此示例中,我想删除 column3 并合并第 5、6、7 列。
下面是我尝试使用的代码,但它读取的是双引号和/或逗号,这与我预期的不同。
awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '{print $1,$4,$5"</br>"$6"</br>"$7",$2}' inputfile.csv
sed -i 's@"</br>"@</br>@g' inputfile.csv
sed 用于删除单元格的开始和结束双引号。
我现在得到的输出文件,如果前一个字段包含双引号,它会认为这是一个单元格的开头,所以后面的值经常被推上一列。
我使用的其他代码将每个逗号都视为单元格的开头,因此效果不佳。
awk -F',' 'BEGIN{OFS=",";} {print $1,$4,$5"</br>"$6"</br>"$7",$2}' inputfile.csv
sed -i 's@"</br>"@</br>@g' inputfile.csv
非常感谢任何帮助。谢谢!
【问题讨论】:
-
"this, but with "comma" and a quote"是单个单元格值吗?为什么内部"没有转义? -
生成“CSV”文件的任何工具都已损坏。有多种可接受的 CSV 格式,它们都不支持字段中的非转义引号 (
"this, but with "comma" and a quote")。它应该是"this, but with ""comma"" and a quote"或"this, but with \"comma\" and a quote"。您能否修复生成此非 CSV 文件的工具?