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()将查找行号,而getSize()将以字节为单位返回filesize。
-
我知道。它只是确保我们搜索所有文件行(即使它们都是空的)。在大多数常见情况下,seek()会在行号上碰到EOF,这个行号肯定少于字节数,但PHP会静默处理它,返回最后一行号。同意,这是肮脏的黑客,但我没有找到任何"干净"的方式快速计算线。
-
工作良好。但文件有99行,但它返回98.你知道为什么吗?
我同意НиколайКонев使用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提供迭代器,每行一次迭代:
函数iterator_count在这里是你的朋友,为你做遍历并返回迭代次数。
您可以使用文件对象的SKIP_EMPTY标志来计算该文件中的空行。
-
很好的答案,但在更大的文件(在这种情况下10mb和135,000+行)它是完全太慢,并尝试使用此方法计数实际上导致超时。
为什么不简单地使用文件处理程序并在这个问题中做?它简单,快速,高效。
如果你绝对必须使用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"; |
-
我推荐使用fopen / fgets传统的文件阅读方式,谢谢。有时我只是在不需要的时候尝试用类来做所有事情。
-
如果你想以面向对象的方式进行文件处理,那就是SPL存在的原因。
-
还有iterator_count()。
-
stackoverflow.com/a/13060695/507203答案快得多:)
-
@cjmling除非单元测试友好。