我必须在工作中的 Windows 环境中使用 Perl,并且我需要能够找出大型 csv 文件包含的行数(大约 1.4Gb)。知道如何以最少的资源浪费做到这一点吗?
谢谢
PS 这必须在 Perl 脚本中完成,我们不允许在系统上安装任何新模块。
我必须在工作中的 Windows 环境中使用 Perl,并且我需要能够找出大型 csv 文件包含的行数(大约 1.4Gb)。知道如何以最少的资源浪费做到这一点吗?
谢谢
PS 这必须在 Perl 脚本中完成,我们不允许在系统上安装任何新模块。
是的,不要使用 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
perl -lne "END { print $. }" myfile.csv
这一次只读取一行,所以它不会浪费任何内存,除非每一行都非常长。
这个单行处理行内的新行:
它使用了令人敬畏的触发器运算符。
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。
支持 edg 的回答,另一种选择是安装cygwin以在 Windows 上获取 wc 和一堆其他方便的实用程序。
我很白痴,在脚本中执行此操作的简单方法是:
open $extract, "<${extractFileName}" or die ("Cannot read row count of $extractFileName");
$rowCount=0;
while (<$extract>)
{
$rowCount=$rowCount+1;
}
close($extract);