zaLinux.ru

Как открыть файл со строки X до строки Y в PHP


Необходимость прочитать только определённые строки в файле является вполне практической задачей. К примеру, однажды мне нужно было из множества однотипных HTML файлов прочитать всё, кроме заголовков. Строки в файлы были с разным содержимым и разной длинны, но шапка всегда включала одинаковое количество строк. Т.е. мне нужно было начать читать файл, к примеру, с 16й строки и считывать его до конца (последние два закрывающихся тэга </body> и </html> я просто отфильтровывал).

Часто для открытия файлов используют функцию fread(), она позволяет указывать количество считываемой информации, но для ситуации, когда строки произвольной длинны, эта функция бесполезна.

Тем не менее, задача легко решается с помощью SplFileObject::seek


$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof() && $i < 500; $i++) {
    echo $file->current(); 
    $file->next();
}

В приведённом выше коде из файла filename.txt будет считано 500 строк начиная с тысячи первой строки. Если вам нужно, чтобы файл начал считываться с тысячной строки и до конца, то код будет выглядеть так:

$file = new SplFileObject('filename.txt');
$file->seek(1000);
for($i = 0; !$file->eof(); $i++) {
    echo $file->current(); 
    $file->next();
}

Этот метод из интерфейса SeekableIterator не надо его путать с fseek.

И поскольку SplFileObject является итерируемым (повторяющимся), вы можете ускорить его с LimitIterator:

$file = new SplFileObject('longFile.txt');
$fileIterator = new LimitIterator($file, 1000, 2000);
foreach($fileIterator as $line) {
    echo $line, PHP_EOL;
}

Как и предыдущий пример, в этом отсчёт начинается с нуля, поэтому будут считаны строки с 1001 по 2001.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован.