Linux工具parsingCSV文件

有没有人知道一个独立的命令行程序,可以用来parsingCSV文件?

要做的事情如:

csvparse -c 2,5,6文件名

从所有行中的第2列和第5列中提取字段。

它应该能够处理CSV文件格式: http : //tools.ietf.org/html/rfc4180这意味着引用字段和转义的内部引号适当 ,所以对于一个示例行有3个字段:

field1,“field,number”“2”“,有内部引号和逗号”,field3

所以,如果我要求领域2上面的行我得到:

字段,数字“2”,有内部引号和逗号

我明白有很多解决scheme,perl,awk(等..),但我想要一个本地的bash命令行工具,不需要我调用其他脚本环境或编写任何额外的代码(!)。

Solutions Collecting From Web of "Linux工具parsingCSV文件"

我的FOSS CSV流编辑器CSVfix正是你想要的。 有一个用于Windows的二进制安装程序,以及用于UNIX / Linux的可编译版本(通过makefile)。

csvtool真的很好。 在Debian / Ubuntu(apt-get install csvtool)中可用。 csvtool是OCaml CSV的一部分: https : //github.com/Chris00/ocaml-csv

尝试粉碎工具 ,他们擅长操纵分隔数据。 这听起来像你正在寻找什么。

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

 csvfilter -f 1,3,5 in.csv > out.csv 

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

 pip install csvfilter 

更多信息在https://github.com/codeinthehole/csvfilter/

我发现csvkit是有用的,它是基于python csv模块,并有相当多的解析复杂的csv文件的选项。

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

file.csv提取第4列

 csvcut -c 4 file.csv 

我也写了一个这样的工具(仅用于 UNIX),叫做csvprintf 。 它也可以以在线方式转换为XML。

我的直觉反应是在Python的csv模块上编写一个脚本包装器(如果还没有这样的话)。

对于Python的csv模块的超轻量级包装,你可以看看pluckr 。

ffe是另一个伟大的工具。 它要求你为大多数不重要的任务创建一个配置文件。 好处在于它非常灵活,可以处理各种结构,逻辑和格式,而其他工具则无法处理。

我喜欢使用csvtool进行快速作业,并使用ffe进行复杂的作业或需要频繁重复的作业。

这听起来像是awk的工作。

您很可能需要为您的特定需求编写自己的脚本,但是本网站有关如何执行此操作的一些对话。

您也可以使用剪切工具将字段剥离。

就像是:

 cut -f 2,5,6 -d , filename 

其中-f参数是所需的字段,-d是所需的分隔符。 然后,您可以对这些结果进行排序,找到唯一的结果,或使用任何其他bash实用程序。 这里有一个很酷的视频,从命令行处理CSV文件。 大约一分钟,我会看看。

不过,我想你可以用awk将切割的工具分组,而不想使用它。 我真的不知道本地bash命令是什么意思,所以我仍然会建议。

快速谷歌揭示了一个awk脚本似乎处理CSV文件。

Perl脚本(需要Text :: CSV_XS):

 #!/usr/bin/perl use strict; use warnings; use Getopt::Long; my @opt_columns; GetOptions("column=i@" => \@opt_columns) or die "Failed parsing options\n"; die "Must give at least one --column\n" if int(@opt_columns) == 0; @opt_columns = map { $_-1 } @opt_columns; # convert 1-based to 0-based use Text::CSV_XS; my $csv = Text::CSV_XS->new ( { binary => 1 } ); open(my $stdin, "<-") or die "Couldn't open stdin\n"; open(my $stdout, ">-") or die "Couldn't open stdout\n"; while (my $row = $csv->getline($stdin)) { my @nrow = @{$row}[@opt_columns]; $csv->print($stdout, \@nrow); print "\n"; } 

把它放在一个文件csvcut.pl

仅取第3栏和第4栏的示例:

 cat foo.csv | ./csvcut.pl --c 3 --c 4 

这只会引用需要引用的列,所以如果输入列有“Bar”(带引号),它会出来Bar(不带引号)。