10
$file = new SplFileObject('/path/to/file.txt');

如何找到文件中的行数SplFileObject

4

4 回答 4

43

iterator_count在 Ubuntu 下的 php 版本 5.3.7 中,逐行迭代使用next()被破坏。

也好象破fseek([any offset], SEEK_END)法。key()返回 0。

seek($lineCount)使用太慢迭代大文件。

最简单的 5.3.7 验证方式是

// force to seek to last line, won't raise error
$file->seek($file->getSize());
$linesTotal = $file->key();

现在计算 30000 行需要 0.00002 秒,并且需要大约 20 kb 的内存。

迭代方法大约需要 3 秒。

于 2012-10-25T02:24:24.163 回答
18

我同意Николай Конев的使用seek function比逐行浏览整个文件要快得多,但正如Twisted1919所说,使用文件大小来查找最后一行是令人困惑的,所以我的建议是使用PHP_INT_MAX而不是文件大小:

// force to seek to last line, won't raise error
$file->seek(PHP_INT_MAX);
$linesTotal = $file->key();
于 2013-11-16T22:33:07.857 回答
6

提供SplFileObject了一个迭代器,每行一次迭代:

$numberOfLines = iterator_count($file);

该函数iterator_count是您的朋友,为您执行遍历并返回迭代次数。

您可以使用文件对象的SKIP_EMPTY标志来计算该文件中的空行。

于 2012-10-20T15:01:06.823 回答
4

为什么不简单地使用文件处理程序并在这个问题中这样做呢?它简单、快速且非常高效。

如果你绝对必须使用 spl,你可以这样做

$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
    $i++;
    $file->next();
}
print "file has " . $i . " lines"; 
于 2011-12-01T14:58:07.560 回答