Perl脚本(或任何内容)总计CSV列

Jas*_*ett 2 csv perl awk

我写了(在其他人的帮助下)一个awk命令来汇总CSV文件中的列.不幸的是,我在谷歌搜索后awk因为分隔符并不总是相同而在处理CSV文件方面表现不佳(即用引号括起来时应忽略逗号).

似乎Perl脚本可能做得更好.是否可以使用单行Perl脚本(或几乎简洁的东西)实现与此awk命令相同的功能,该命令总计CSV文件的第5列?

cat file.csv | awk -F "\"*,\"*" '{s+=$5} END {printf("%01.2f\n", s)}'
Run Code Online (Sandbox Code Playgroud)

我并没有特别嫁给Perl,但我希望避免编写一个完整的PHP脚本.这时我可以轻松编写一个PHP脚本,但是现在我已经走到这一步了,我想看看我是否能够完成它.

DVK*_*DVK 6

您需要使用一个不错的CSV解析器来处理CSV格式的所有复杂性.Text :: CSV_XS(或Text :: CSV,如果不可用)是首选之一.

perl -e '{use Text::CSV_XS; my $csv=Text::CSV_XS->new(); open my $fh, "<", "file.csv" or die "file.csv: $!"; my $sum = 0; while (my $row = $csv->getline ($fh)) {$sum += $row->[4]}; close $fh; print "$sum\n";}'
Run Code Online (Sandbox Code Playgroud)

这是实际的Perl代码,以提高可读性

use Text::CSV_XS; # use the parser library
my $csv = Text::CSV_XS->new(); # Create parser object
open my $fh, "<", "file.csv" or die "file.csv: $!"; # Open the file. 
my $sum = 0; 
while (my $row = $csv->getline ($fh)) { # $row is array of field values now
    $sum += $row->[4];
}
close $fh; 
print "$sum\n";
Run Code Online (Sandbox Code Playgroud)

使用质量稍差但更密集的Perl可以缩短上述内容:

cat file.csv | perl -MText::CSV_XS -nae '$csv=Text::CSV_XS->new(); 
               $csv->parse($_); @f=$csv->fields(); $s+=$f[4]} { print "$s\n"'
Run Code Online (Sandbox Code Playgroud)