$file = new SplFileObject('/path/to/file.txt');
如何使用SplFileObject
找到文件中的行数?
答案 0 :(得分:36)
iterator_count
并使用next()
逐行迭代在我的php版本5.3.7中在Ubuntu下破解。
同样似乎已经破解了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秒钟。
答案 1 :(得分:15)
我同意Николай Конев使用seek function
比逐行浏览整个文件要快得多,但正如Twisted1919所说使用文件大小来寻找最后一行是令人困惑的所以我的建议是使用PHP_INT_MAX而不是文件大小:
// force to seek to last line, won't raise error
$file->seek(PHP_INT_MAX);
$linesTotal = $file->key();
答案 2 :(得分:5)
SplFileObject
提供一个迭代器,每行一次迭代:
$numberOfLines = iterator_count($file);
函数iterator_count
在这里是你的朋友,为你做遍历并返回迭代次数。
您可以使用文件对象SKIP_EMPTY
flag来计算该文件中的空行。
答案 3 :(得分:4)
为什么不简单地使用文件处理程序并在this question中使用?它简单,快速,高效。
如果你绝对必须使用spl,你可以这样做
$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
$i++;
$file->next();
}
print "file has " . $i . " lines";
答案 4 :(得分:0)
为什么不只使用count函数:
<?php
$file = "file.txt";
$count = count(file($file));
echo "there are $count lines";
?>
超级好用。