3

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

谢谢

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

4

6 回答 6

14

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

于 2009-04-15T15:27:17.770 回答
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
于 2009-04-15T15:24:45.360 回答
4
perl -lne "END { print $. }" myfile.csv

这一次只读取一行,所以它不会浪费任何内存,除非每一行都非常长。

于 2009-04-15T15:28:45.880 回答
3

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

  1. 考虑带有奇数个引号的行。
  2. 考虑到双引号是在字段中表示引号的一种方式。
  3. 它使用了令人敬畏的触发器运算符。

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

考虑:

  • wc不会工作。计数行很棒,但不是 CSV 行
  • 应该安装 - 或争取安装 -Text::CSV或一些类似的标准包以进行正确处理。
  • 尽管如此,这可能会让你到达那里。


编辑:我没想到这是窗户:

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

奇怪的是,The Broken OS 的 shell 解释&&为 OS 条件执行,我无法改变它的想法!!如果我逃脱了它,它就会以这种方式传递给 perl。

于 2009-04-15T17:29:22.360 回答
0

支持 edg 的回答,另一种选择是安装cygwin以在 Windows 上获取 wc 和一堆其他方便的实用程序。

于 2009-04-15T15:31:26.170 回答
-1

我很白痴,在脚本中执行此操作的简单方法是:

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

close($extract);
于 2009-04-16T09:21:46.517 回答