如何使用Perl计算大型CSV文件中的行数?

时间:2009-04-15 15:21:25

标签: perl csv large-data-volumes

我必须在工作的Windows环境中使用Perl,并且我需要能够找出大型csv文件包含的行数(大约1.4Gb)。 知道如何以最少的资源浪费做到这一点吗?

由于

PS这必须在Perl脚本中完成,我们不允许在系统上安装任何新模块。

6 个答案:

答案 0 :(得分:14)

你的意思是线条还是行?单元格可能包含换行符,这会将行添加到文件中,但不会添加行。如果您确保没有单元格包含新行,那么只需使用Perl FAQ中的技术即可。否则,您需要一个适当的CSV解析器,如Text::xSV

答案 1 :(得分:9)

是的,不要使用perl。

而是使用简单的实用程序来计算线条;的 wc.exe

它是从unix原件移植的一套 Windows实用程序 的一部分。

http://unxutils.sourceforge.net/

例如;

PS D:\> wc test.pl
     12      26     271 test.pl
PS D:\>

其中12 ==行数,26 ==单词数,271 ==字符数。

如果你真的必须使用perl;

D:\>perl -lne "END{print $.;}" < test.pl
12

答案 2 :(得分:4)

perl -lne "END { print $. }" myfile.csv

这一次只读取一行,因此除非每行都非常长,否则不会浪费任何内存。

答案 3 :(得分:3)

这个单行处理行中的新行:

  1. 考虑具有奇数引号的行。
  2. 考虑加倍引号是一种在字段内指示引号的方法。
  3. 它使用 awesome 触发器操作符。

    perl -ne 'BEGIN{$re=qr/^[^"]*(?:"[^"]*"[^"]*)*?"[^"]*$/;}END{print"Count: $t\n";}$t++ unless /$re/../$re/'
    
  4. 考虑一下:

    • wc无效。这对计算行很棒,但不是CSV行
    • 安装 - 或争取安装 - Text::CSV或类似的标准包以便妥善处理。
    • 尽管如此,这可能会让你到那里。

    <小时/> 编辑:我认为这是Windows:

    perl -ne "BEGIN{$re=qr/^[^\"]*(?:\"[^\"]*\"[^\"]*)*?\"[^\"]*$/;}END{print qq/Count: $t\n/;};$t++ unless $pq and $pq = /$re/../$re/;"
    

    奇怪的是,破碎的操作系统'shell将&&解释为操作系统条件执行程序,我无法改变主意!! 如果我逃脱它,它只会将它传递给perl。

答案 4 :(得分:0)

upvote for edg的答案,另一个选择是安装cygwin以获取Windows上的wc和其他一些方便的实用程序。

答案 5 :(得分:-1)

我很愚蠢,在剧本中这样做的简单方法是:

open $extract, "<${extractFileName}" or die ("Cannot read row count of $extractFileName");
$rowCount=0;    
while (<$extract>)
{
    $rowCount=$rowCount+1;
}

close($extract);