代码之家  ›  专栏  ›  技术社区  ›  Jason Swett

Perl脚本(或任何东西)总计CSV列

  •  2
  • Jason Swett  · 技术社区  · 14 年前

    awk command 合计CSV文件中的列。不幸的是,我通过谷歌搜索得知 锥子 不擅长处理CSV文件,因为分隔符并不总是相同的(即当用引号括起来时,应忽略逗号)。

    似乎Perl脚本可以做得更好。是否有可能有一个单行Perl脚本(或类似简洁的脚本)来实现与此相同的功能 锥子 总计CSV文件第5列的命令?

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

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

    5 回复  |  直到 8 年前
        1
  •  6
  •   daxim Fayland Lam    14 年前

    您需要使用一个体面的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";}'
    

    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";
    

    使用质量稍差但密度更高的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"'
    
        2
  •  3
  •   daxim Fayland Lam    14 年前

    您反对使用Perl模块吗?你可以用 Text::CSV 不需要滚动自己的解析器就可以轻松完成这项工作。

    Tutorial 代码段已更改为执行总计:

    # ... some tutorial code ommited
    while (<CSV>) {
        if ($csv->parse($_)) {
            my @columns = $csv->fields();
            $total += $columns[4];
        } else {
            my $err = $csv->error_input;
            print "Failed to parse line: $err";
        }
    }
    print "total: $total\n";
    
        3
  •  2
  •   S.Lott    14 年前

    蟒蛇

    import csv
    with open( "some_file.csv", "rb" ) as source:
        rdr= csv.reader( source )
        col_5= 0
        for row in rdr:
            col_5 += row[5]
    print col_5
    

        4
  •  0
  •   harleypig    14 年前

    有很多工具可以做到这一点。快速搜索“cli csvparser”可以找到几个工具(显然我无法链接到这些工具——可能是为了防止垃圾邮件)。

    我安装了我发现的第一个csvtool,并且能够执行与您类似的命令行,得到一个总数。

        5
  •  0
  •   Hynek -Pichi- Vychodil Paulo Suassuna    14 年前

    非常短(和快速)的解决方案:

    perl -MText::CSV_XS -E'$c=new Text::CSV_XS;$s+=$r->[4]while$r=$c->getline(*ARGV);say$s' file.csv