关于php:如何使用SplFileObject获取行数?

How to get number of lines with SplFileObject?

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

如何在SplFileObject中找到文件中的行数?


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

也似乎破了fseek([any offset], SEEK_END)方法。 key()返回0。

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

最简单的5.3.7验证方式是

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

计数30000行现在需要0.00002秒并且花费大约20kb的内存。

迭代方法大约需要3秒钟。


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

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


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

1
$numberOfLines = iterator_count($file);

函数iterator_count在这里是你的朋友,为你做遍历并返回迭代次数。

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


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

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

1
2
3
4
5
6
7
$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
    $i++;
    $file->next();
}
print"file has" . $i ." lines";