2

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

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. 除了 PHP 函数之外,有没有使用Windows 命令来确定文件大小的方法?


解决方案

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

4

4 回答 4

3

也许你可以使用:

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

这将在任何地方工作。

file()将文件读入一个数组,在换行符处分割,并count()计算数组的长度。

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

于 2012-06-21T08:52:37.397 回答
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));

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

于 2012-06-21T09:21:55.050 回答
0

用于计算行号的 Windows 命令:

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

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

于 2012-06-21T10:45:50.697 回答
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+ 行为基准,执行时间为:
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秒。

于 2019-02-05T11:05:52.247 回答