4

如何从 CSV 文件中删除具有逗号分隔值的列,其中字符串用双引号括起来,中间有逗号?我有一个 44.csv 文件,它有 4 行,包括如下格式的标题:

column1, column2, column3, column 4, column5, column6
12,455,"string with quotes, and with a comma in between",4432,6787,890,88
4432,6787,"another, string with quotes, and with two comma in between",890,88,12,455
11,22,"simple string",77,777,333,22

我需要从文件中剪切 1,2,3 列,所以我使用如下剪切命令

cut -d"," -f1,2,3 44.csv > 444.csv

我得到的输出为

column1, column2, column3
12,455,"string with quotes
4432,6787,"another string with quotes
11,22,"simple string"

但我需要输出

column1, column2, column3
12,455,"string with quotes, and with a comma in between"
4432,6787,"another, string with quotes, and with two comma in between"
11,22,"simple string"

任何帮助是极大的赞赏。

谢谢德鲁夫。

4

3 回答 3

3

使用GNU awk版本 4 或更高版本,您可以使用FPAT来定义模式。

gawk '{print $1, $2, $3}' FPAT="([^,]+)|(\"[^\"]+\")" OFS="," 44.csv

测试:

$ gawk '{print $1, $2, $3}' FPAT="([^,]+)|(\"[^\"]+\")" OFS="," mycsv.csv
column1, column2, column3
12,455,"string with quotes, and with a comma in between"
4432,6787,"another, string with quotes, and with two comma in between"
11,22,"simple string"
于 2013-06-19T19:12:55.287 回答
2

我和你有同样的问题 Dhruuv,jaypal singh 提出的解决方案是正确的,但不适用于我的所有情况。我建议您使用:https ://github.com/dbro/csvquote (使常见的 unix 实用程序(如 cut、head、tail)能够正确处理包含分隔符和换行符的 csv 数据)这对我有用。

于 2015-03-18T23:26:54.687 回答
0

在这种特殊情况下,您可以使用 cut"作为分隔符来执行此操作,但我强烈建议您不要这样做 - 即使您可以在这种情况下使其工作,您稍后可能会得到一个带有转义双引号的字符串在其中,例如\",这也会愚弄。或者,您的更多列可能会被引用(这是一个完全有效的 CSV 主义)。

需要更智能的工具!最容易获得的可能是 Perl 和 Text::CSV 模块——您几乎肯定已经安装了 Perl,并且根据您的环境将 Text::CSV 作为包安装,使用 CPAN.pm 或使用 cpanminus 应该直截了当。

于 2013-06-19T19:19:36.553 回答