如何在Linux命令行上解析CSV文件?

Joe*_*oel 35 unix linux csv

如何在Linux命令行上解析CSV文件?

做以下事情:

csvparse -c 2,5,6 filename
Run Code Online (Sandbox Code Playgroud)

从所有行中提取第2,5和6列的字段.

它应该能够处理csv文件格式:http://tools.ietf.org/html/rfc4180这意味着引用字段并根据需要转义内部引号,因此对于包含3个字段的示例行:

field1,"field, number ""2"", has inner quotes and a comma",field3
Run Code Online (Sandbox Code Playgroud)

所以,如果我请求上面一行的字段2,我得到:

field, number "2", has inner quotes and a comma
Run Code Online (Sandbox Code Playgroud)

我很欣赏有很多解决方案,Perl,Awk(等)来解决这个问题,但我想要一个本机bash命令行工具,它不需要我调用其他脚本环境或编写任何其他代码(!).

Lar*_*ari 22

csvtool非常好.可在Debian/Ubuntu(apt-get install csvtool)中使用.例:

csvtool namedcol Account,Cost input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

有关使用提示,请参见CSVTool手册页.

  • csvtool在写入stdout之前在内存中构建整个输出......显然根本就没有流. (9认同)
  • 我也尝试了一下.在开始时看起来很有希望,但是如果你的CSV大于100MB,那么它会因为堆栈溢出而死亡. (3认同)
  • 刚尝试使用`csvtool`,5年后(现在是2017年)它仍然没有流支持并导致110MB csv文件的堆栈溢出 (3认同)

小智 20

我的FOSS CSV流编辑器CSVfix完全符合您的要求.有一个用于Windows的二进制安装程序,以及一个用于UNIX/Linux的可编译版本(通过makefile).

  • 顺便说一句 - 感谢你没有回答a)"为什么不自己写一个?" b)"使用awk/perl".如果我想要使用这两个选项中的任何一个,我就不会在第一时间提出问题. (4认同)
  • @Joel:问题在于你的问题.当你应该说"独立程序"时,你要求一个"bash命令".您的请求与bash没有任何关系. (3认同)
  • csvfix完全正确的做法.它是一个功能强大的csv流编辑器,在Windows和Linux上运行,并且比我希望的更多! (2认同)

stu*_*eek 9

正如@Jonathan在评论中所建议的那样,python的模块提供了命令行工具csvfilter.它像剪切一样工作,但正确处理CSV列引用:

csvfilter -f 1,3,5 in.csv > out.csv
Run Code Online (Sandbox Code Playgroud)

如果你有python(你应该),你可以像这样安装它:

pip install csvfilter
Run Code Online (Sandbox Code Playgroud)

更多信息,访问https://github.com/codeinthehole/csvfilter/


cjg*_*cjg 7

我发现csvkit很有用,它基于python csv模块,并且有很多选项可用于解析复杂的csv文件.

虽然看起来有点慢.当从具有5列的7GB csv中提取一个字段时,我得到4MB/s(100%cpu).

从中提取第4列 file.csv

csvcut -c 4 file.csv
Run Code Online (Sandbox Code Playgroud)


jma*_*g2k 5

尝试使用crush-tools,他们非常善于操作分隔数据.这听起来就像你正在寻找的.