gpt4 book ai didi

用于汇总 CSV 列的 Perl 脚本(或任何东西)

转载 作者:行者123 更新时间:2023-12-02 06:10:03 28 4
gpt4 key购买 nike

我写了(在其他人的很多帮助下)awk command汇总 CSV 文件中的一列。不幸的是,在谷歌搜索后我了解到 awk 不擅长处理 CSV 文件,因为分隔符并不总是相同的(即当用引号括起来时应该忽略逗号)。

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

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

我并没有特别喜欢 Perl,但我希望避免编写成熟的 PHP 脚本。到那时我已经可以轻松地编写 PHP 脚本了,但是现在我已经走到这一步了,我想看看我是否可以跟进它。

最佳答案

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

这是实际的 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";

可以通过使用质量稍差但更密集的 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"'

关于用于汇总 CSV 列的 Perl 脚本(或任何东西),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4159695/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com