如何在CSV文件中找到整数列,并使用Perl获取该列的总和?

时间:2016-04-21 11:11:06

标签: regex perl csv

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

  1. 要使用以下命令获取列中的整数值之和:

    perl -e "map {$x += $_} <> and print $x" < filepath
    
  2. 但是这个命令只给出了我的CSV文件中第一列的总和。但我的csv文件可以在任何位置都有一个整数列。

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

      my $sum = 0;
      my $line = "111^ABC^XYZ^120000";    
      chomp $line;    
      my @fields = split /^/ , $line;   
      $sum += $fields[0];    
      print "$sum\n";
      
    2. 当我用^(冒号)等替换:(插入符号)时,此脚本正常工作,但我的csv包含由插入符号(^)分隔的数据。工作。
      所以有人可以建议我在Perl中找到一个解决方案,它可以在我的csv文件中找到整数列的位置并计算这些列的总和,或者我如何使上述脚本适用于^(插入符号)。

      以下是csv文件的前几行:

      &#34; EMP_ID&#34; ^&#34; EMP_NAME&#34; ^&#34; LOCATION&#34; ^&#34; SALARY&#34;

      &#34; 111&#34; ^&#34; NAME1&#34; ^&#34; LOC1&#34; ^&#34; 120000&#34;

      &#34; 122&#34; ^&#34; NAME2&#34; ^&#34; LOC2&#34; ^&#34; 24000&#34;

      &#34; 133&#34; ^&#34; NAME3&#34; ^&#34;中Loc3&#34; ^&#34; 55000&#34;

      &#34; 144&#34; ^&#34; NAME4&#34; ^&#34; LOC4&#34; ^&#34; 30000&#34;

2 个答案:

答案 0 :(得分:2)

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

split /\^/

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

答案 1 :(得分:0)

可以帮助你的事情:

  • -n选项,它将解析文件的每一行
  • -a选项,在
  • 上变为自动分割
  • -F选项,为分组
  • 选择不同的分隔符

考虑到这一点,例如:

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

应该这样做。

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