为了确定我目前使用的是文件行的确切数目:
if(exec("wc -l ".escapeshellarg($strFile), $arResult)) {
$arNum = explode(" ", $arResult[0]);
// ...
}
什么是做同样的在Windows的最佳方式?
编辑:
从另一个问题的一个尝试:
$file="largefile.txt";
$linecount = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
$line = fgets($handle);
$linecount++;
}
fclose($handle);
echo $linecount;
解
我用命令find
去,因为建议中的评论接受的答案。
我更愿意只遍历文件,读取一行每次和递增计数器,使用和计算由file()返回的数组是只为更小的文件好。
<?php
$loc = 'Ubuntu - 10.10 i386.iso';
$f = fopen($loc,'r');
$count = 0;
while (fgets($f)) $count++;
fclose($f);
print "Our file has $count lines" . PHP_EOL;
如果你会使用file()了这么大的文件时,它会读它完全到内存中,可以根据您的情况是禁止的。如果这是一个1次“我不关心,这是我的工作站,我有足够的内存”的局面或将文件,保证是小,那么你可以使用
count(file($loc));
否则,我倒是通过循环,特别是因为如果行动将不得不通过许多方法来进行。经历了整个文件,但内存的计数循环的两种方式在第二种情况下大大增加。
也许你可以使用:
$length = count(file($filename));
这将在任何地方工作。
file()
读取文件到一个数组,分割于换行符和count()
计数阵列的长度。
如果不(在例如Macintosh文件)正常工作,看看这里:http://www.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings
Windows命令来计算行号:
find /c /v "" < type file-name.txt
从Stupid command-line trick: Counting the number of lines in stdin改编。
这是使用substr_count
,比fgets
快得多:
$file="largefile.txt";
$linecount = 0;
$chunk_size = (2<<20); // 2MB chuncks
$handle = fopen($file, "r");
while(!feof($handle)){
$chunk = fread($handle,$chunk_size);
$linecount += substr_count($chunk,PHP_EOL);
// $linecount += substr_count($chunk,"\n"); // also with \n, \r, or \r\n
}
fclose($handle);
echo $linecount;
该代码是考虑到使用至少存储器(2个MB组块)的。基准具有85 MB的文件和8M +线,执行时间为:
•fgets
:52.11271秒。
•substr_count(PHP_EOL)
:0.58844秒。
•substr_count(\n)
:0.353772秒。
•find /c /v "" largefile.txt
:100秒。
然而,如果有与主机系统的可用内存,如OP没有问题,并在适当的PHP内存限制设置(不是文件长度大),substr_count
可以搜索与多表现文件的全部内容:
$file="largefile.txt";
@ini_set('memory_limit', (2<<24)+(filesize($file)) ); // 32 MB for PHP + File size
$linecount = 0;
$handle = file_get_contents($file);
if($handle) $linecount = substr_count($handle, PHP_EOL);
echo $linecount;
你可以选择你想要的任何解释的内存大小。 基准测试:0.46878秒。