Как получить количество строк с помощью 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
флаг чтобы не считать пустые строки в этот файл.