Php 如何使用SplFileObject获取行数?
如何使用查找文件中的行数?为什么不简单地使用文件处理程序,并在中执行类似操作?它简单、快速、高效 如果你必须使用spl,你可以这样做Php 如何使用SplFileObject获取行数?,php,spl,Php,Spl,如何使用查找文件中的行数?为什么不简单地使用文件处理程序,并在中执行类似操作?它简单、快速、高效 如果你必须使用spl,你可以这样做 $file = new SplFileObject('/path/to/file.txt'); SplFileObject提供一个itertor,每行一次迭代: $file = new SplFileObject("/path/to/file.txt"); $i = 0; while (!$file->eof()) { $i++; $fil
$file = new SplFileObject('/path/to/file.txt');
SplFileObject
提供一个itertor,每行一次迭代:
$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
$i++;
$file->next();
}
print "file has " . $i . " lines";
函数是您在这里的朋友,为您执行遍历并返回迭代次数
你可以利用file对象不计算该文件中的空行。
迭代器\u count
使用next()
逐行迭代在Ubuntu下的php版本5.3.7中被破坏
也似乎被破坏了fseek([任何偏移],SEEK\u END)
方法key()
返回0
使用seek($lineCount)
在大文件上迭代太慢
最简单的5.3.7验证方法是
$numberOfLines = iterator_count($file);
计算30000行现在需要0.00002秒,需要大约20KB的内存
迭代方法大约需要3秒钟。我同意使用搜索功能
比逐行搜索整个文件快得多,但正如所说,使用文件大小搜索最后一行会让人困惑,因此我的建议是使用而不是使用文件大小:
// force to seek to last line, won't raise error
$file->seek($file->getSize());
$linesTotal = $file->key();
我使用了fopen/fgets传统的文件读取方式,如您推荐的,谢谢。有时我只是尝试在不需要类的时候使用它来处理所有的事情。如果你想以面向对象的方式处理文件,这就是SPL存在的原因。答案很好,但是在更大的文件上(本例中为10mb和135000多行)它太慢了,使用此方法进行计数实际上会导致超时。这是错误的,seek()将查找行号,而getSize()将返回以字节为单位的文件大小。我知道。它只是确保我们查找所有文件行(即使所有文件行都是空的)。在大多数情况下,seek()会在行号上跳到EOF,行号肯定小于字节数,但PHP会以静默方式处理它,返回最后一个行号。同意,这是肮脏的黑客行为,但我没有找到任何“干净”的方法来快速计算行数。工作正常。但文件有99行,但返回98行。你知道为什么吗?注意:键返回最后一行的索引,所以这总是比总数少一行。您需要在总数中添加一个:$linesTotal=$file->key()+1代码>
// force to seek to last line, won't raise error
$file->seek(PHP_INT_MAX);
$linesTotal = $file->key();