【问题标题】:How to find integer column in CSV file and also get sum of that column using Perl?如何在 CSV 文件中查找整数列并使用 Perl 获取该列的总和?
【发布时间】:2016-08-14 13:11:55
【问题描述】:

我在从数据库表中读取记录后生成 CSV 文件。为了验证 CSV 文件是否正确生成,我需要在 CSV 中找到整数列并计算它们的总和以与数据库表进行比较。 我想使用 Perl 来完成这项任务,因为我的一些 CSV 文件可能包含大量记录。 我对 Perl 很陌生,搜索后我应用了以下解决方案:-

  1. 为了获得列中整数值的总和,使用下面给出的命令:

    perl -e "map {$x += $_} <> and print $x" < filepath
    

但是这个命令只给出了我的 CSV 文件中第一列的总和。但是我的 csv 文件可以在任何位置有一个整数列。

  1. 然后我尝试了以下脚本:

    my $sum = 0;
    my $line = "111^ABC^XYZ^120000";    
    chomp $line;    
    my @fields = split /^/ , $line;   
    $sum += $fields[0];    
    print "$sum\n";
    

当我将 ^(caret sign) 替换为 :(colon) 等时,此脚本工作正常,但我的 csv 包含由 caret(^) 分隔的数据,这不起作用。
那么任何人都可以建议我在 Perl 中找到一个解决方案,它可以在我的 csv 文件中找到整数列的位置并计算这些列的总和,或者我怎样才能使上述脚本适用于^(插入符号)。

这是 csv 文件的前几行:

"EMP_ID"^"EMP_NAME"^"LOCATION"^"SALARY"

"111"^"name1"^"loc1"^"120000"

"122"^"name2"^"loc2"^"24000"

"133"^"name3"^"loc3"^"55000"

"144"^"name4"^"loc4"^"30000"

【问题讨论】:

    标签: regex perl csv


    【解决方案1】:

    Caret 在正则表达式中很特殊:它匹配一行的开头。要匹配文字插入符号,您需要反斜杠:

    split /\^/
    

    对于 CSV 操作,如果您的输入包含带引号的字段或转义的分隔符,Text::CSV 通常会更好。

    【讨论】:

    • 谢谢,它对我有用。这是一个好的解决方案还是有更好的解决方案?
    【解决方案2】:

    对你有帮助的事情:

    • -n 选项,它将解析文件的每一行
    • -a 选项,用于开启自动拆分
    • -F 选项,为拆分选择不同的分隔符

    考虑到这一点,类似于:

    perl -F"\^" -nae 'END {print $total} $total += $_ for @F' _
    

    应该可以解决问题。

    请注意,您将添加每一列;只是其中一些会被解析为0。

    【讨论】:

    • 谢谢,我尝试了你的解决方案,但它只给了我来自 csv 的第一列的总价值。
    • 你能把那个文件的 3-5 行粘贴在这里吗?
    • 你好.. 我已经编辑了我的帖子以包含我的 CSV 文件的一些示例行。
    • 您的新值用引号括起来;添加时,它们都以" 开头的事实意味着它们被解析为0 的整数值。在添加引号之前,您需要去掉引号。
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2016-10-11
    • 1970-01-01
    • 2014-11-08
    • 2013-01-23
    相关资源
    最近更新 更多