在Windows上计算PHP中的文件行

时间:2012-06-21 08:48:53

标签: php windows numbers exec lines

确定我当前使用的文件中的确切行数:

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;
  1. 有没有人使用大文件获得这种方式的经验?

  2. 有没有办法使用 Windows命令来确定除PHP函数之外的文件大小?


  3. 解决方案

    我按照评论中接受的答案的建议使用命令find

4 个答案:

答案 0 :(得分:2)

也许你可以使用:

$length = count(file($filename));

哪个可以在任何地方使用。

file()将文件读入数组,拆分换行符,count()计算数组的长度。

如果它无法正常工作(例如在macintosh文件中),请查看此处:http://www.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings

答案 1 :(得分:0)

我更喜欢循环浏览文件,每次读取一行并递增计数器,使用和计算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()这么大的文件,它会将其完全读入内存,这可能会让您感到高兴,具体取决于您的情况。如果这是一次“我不在乎,这是我的工作站,我有足够的内存”情况或文件保证很小,那么你可以使用

count(file($loc));

否则我会循环,特别是因为如果必须由许多进程执行操作。两种计数方式都循环遍历整个文件,但在第二种情况下,内存大大增加。

答案 2 :(得分:0)

用于计算行号的Windows命令:

find /c /v "" < type file-name.txt

改编自Stupid command-line trick: Counting the number of lines in stdin

答案 3 :(得分:0)

这正在使用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 +行的 Benchmark ,执行时间为:
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 秒。