【发布时间】:2012-01-10 17:08:09
【问题描述】:
$file = new SplFileObject('/path/to/file.txt');
如何使用SplFileObject 查找文件中的行数?
【问题讨论】:
$file = new SplFileObject('/path/to/file.txt');
如何使用SplFileObject 查找文件中的行数?
【问题讨论】:
为什么不简单地使用文件处理程序并在this question 中做类似的事情?它简单、快速且非常高效。
如果你绝对必须使用 spl,你可以这样做
$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
$i++;
$file->next();
}
print "file has " . $i . " lines";
【讨论】:
SplFileObject 提供了一个迭代器,每行一次迭代:
$numberOfLines = iterator_count($file);
函数iterator_count是你的朋友,为你做遍历并返回迭代次数。
您可以利用文件对象的SKIP_EMPTY flag 不计算该文件中的空行。
【讨论】:
iterator_count 和使用next() 的逐行迭代在我在 Ubuntu 下的 php 版本 5.3.7 中被破坏。
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 秒。
【讨论】:
$linesTotal = $file->key() + 1;
我同意Николай Конев 关于使用seek function 比逐行浏览整个文件要快得多,但正如Twisted1919 所说,使用文件大小来查找最后一行令人困惑,所以我的建议是使用@ 987654323@而不是文件大小:
// force to seek to last line, won't raise error
$file->seek(PHP_INT_MAX);
$linesTotal = $file->key();
【讨论】: