Как получить количество строк с помощью SplFileObject?

$file = new SplFileObject('/path/to/file.txt');

Как я могу найти количество строк в файле с SplFileObject?

4 ответов


почему бы просто не использовать обработчики файлов и делать как в этот вопрос? Его простой, быстрый и очень эффективный.

Если вы абсолютно должны использовать SPL, вы можете сделать это

$file = new SplFileObject("/path/to/file.txt");
$i = 0;
while (!$file->eof()) {
    $i++;
    $file->next();
}
print "file has " . $i . " lines"; 

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 кб памяти.

метод итераций занимает около 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 предлагает itertor, одной итерации в строке:

$numberOfLines = iterator_count($file);

функции iterator_count ваш друг здесь, делает обход для вас и возвращает количество итераций.

вы можете использовать SKIP_EMPTY флаг чтобы не считать пустые строки в этот файл.