我必须在工作的Windows环境中使用Perl,并且我需要能够找出大型csv文件包含的行数(大约1.4Gb)。 知道如何以最少的资源浪费做到这一点吗?
由于
PS这必须在Perl脚本中完成,我们不允许在系统上安装任何新模块。
答案 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)
这个单行处理行中的新行:
它使用 awesome 触发器操作符。
perl -ne 'BEGIN{$re=qr/^[^"]*(?:"[^"]*"[^"]*)*?"[^"]*$/;}END{print"Count: $t\n";}$t++ unless /$re/../$re/'
考虑一下:
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);