$file = new SplFileObject('/path/to/file.txt');
如何找到文件中的行数SplFileObject
?
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 秒。
我同意Николай Конев的使用seek function
比逐行浏览整个文件要快得多,但正如Twisted1919所说,使用文件大小来查找最后一行是令人困惑的,所以我的建议是使用PHP_INT_MAX而不是文件大小:
// force to seek to last line, won't raise error
$file->seek(PHP_INT_MAX);
$linesTotal = $file->key();
提供SplFileObject
了一个迭代器,每行一次迭代:
$numberOfLines = iterator_count($file);
该函数iterator_count
是您的朋友,为您执行遍历并返回迭代次数。
您可以使用文件对象的SKIP_EMPTY
标志来计算该文件中的空行。
为什么不简单地使用文件处理程序并在这个问题中这样做呢?它简单、快速且非常高效。
如果你绝对必须使用 spl,你可以这样做
$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
$i++;
$file->next();
}
print "file has " . $i . " lines";