如何在Linux命令行上解析CSV文件? [关闭]

问题描述 投票:35回答:12

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

做以下事情:

csvparse -c 2,5,6 filename

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

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

field1,"field, number ""2"", has inner quotes and a comma",field3

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

field, number "2", has inner quotes and a comma

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

linux unix csv
12个回答
20
投票

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


1
投票

cut -f 2,5,6 -d , filename 是另一个伟大的工具。它要求您为大多数重要任务创建配置文件。好处是它非常灵活,可以处理其他工具无法处理的各种结构,逻辑和格式。

我喜欢使用here快速工作,并使用ffe进行复杂的工作或需要经常重复的工作。


0
投票

一个快速的谷歌揭示了一个似乎处理csv文件的csvtool


0
投票

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

ffe

把它放在awk script文件中。

仅采用第3列和第4列的示例:

#!/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";
}

这将仅引用需要引用的列,因此如果输入列具有“Bar”(带引号),它将出现Bar(不带引号)。


21
投票

csvtool非常好。可在Debian / Ubuntu(apt-get install csvtool)中找到。例:

csvtool namedcol Account,Cost input.csv > output.csv

有关使用技巧,请参阅CSVTool manual page


9
投票

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

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

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

pip install csvfilter

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


7
投票

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

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

file.csv提取第4列

csvcut -c 4 file.csv

5
投票

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


3
投票

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


2
投票

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


2
投票

对于Python qazxsw poi模块的超轻量级包装,您可以查看qazxsw poi。


1
投票

这听起来像是awk的工作。

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

您还可以使用剪切实用程序去除字段。

就像是:

pluckr

其中-f参数是您想要的字段,-d是您想要的分隔符。然后,您可以对这些结果进行排序,找到唯一的结果,或使用任何其他bash实用程序。有一个很酷的视频this关于从命令行使用CSV文件。差不多一分钟,我来看看。

但是,我猜你可以用awk对cut实用程序进行分组,而不想使用它。我不知道你的本地bash命令究竟是什么意思,所以我仍然会建议它。

© www.soinside.com 2019 - 2024. All rights reserved.