$file = new SplFileObject('/path/to/file.txt');
Как найти количество строк в файле с помощью SplFileObject
?
Почему бы просто не использовать обработчики файлов и не делать этого в этом вопросе ? Его простой, быстрый и очень эффективный.
Если вы абсолютно должны использовать 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)
метод 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
предлагает итератор, по одной итерации в строке:
$numberOfLines = iterator_count($file);
Функция iterator_count
– ваш друг здесь, совершая обход для вас и возвращающий количество итераций.
Вы можете использовать флаг SKIP_EMPTY
файла файла, чтобы не считать пустые строки в этом файле.