Php 如何使用SplFileObject获取行数?

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

如何使用查找文件中的行数?

为什么不简单地使用文件处理程序,并在中执行类似操作?它简单、快速、高效

如果你必须使用spl,你可以这样做

$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();