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

Самое близкое, что я видел в документах PHP, – это fread () заданная длина, но это не указывает, с какой строки начать. Любые другие предложения?

Вы не сможете читать, начиная с строки X, потому что строки могут иметь произвольную длину. Таким образом, вам нужно будет прочитать с начала подсчет количества строк, прочитанных для перехода к строке X. Например:

<?php $f = fopen('sample.txt', 'r'); $lineNo = 0; $startLine = 3; $endLine = 6; while ($line = fgets($f)) { $lineNo++; if ($lineNo >= $startLine) { echo $line; } if ($lineNo == $endLine) { break; } } fclose($f); 

Да, вы можете сделать это легко с помощью SplFileObject::seek

 $file = new SplFileObject('filename.txt'); $file->seek(1000); for($i = 0; !$file->eof() && $i < 1000; $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 год.

К сожалению, чтобы читать строки из строки x в строку y, вам нужно будет обнаружить разрывы строк … и вам придется сканировать весь файл. Однако, предполагая, что вы не спрашиваете об этом по соображениям производительности, вы можете получить строки x в y со следующим:

 $x = 10; //inclusive start line $y = 20; //inclusive end line $lines = file('myfile.txt'); $my_important_lines = array_slice($lines, $x, $y); 

См .: array_slice

Вот возможное решение 🙂

 <?php $f = fopen('sample.txt', 'r'); $lineNo = 0; $startLine = 3; $endLine = 6; while ($line = fgets($f)) { $lineNo++; if ($lineNo >= $startLine) { echo $line; } if ($lineNo == $endLine) { break; } } fclose($f); ?> 

Ну, вы не можете использовать функцию fseek для поиска соответствующей позиции, потому что она работает с заданным количеством байтов.

Я думаю, что это невозможно без какого-либо кеша или прохождения строк один за другим.

Если вы ищете строки, вы не можете использовать fread, потому что это зависит от смещения байта, а не от количества разрывов строк. Вам действительно нужно прочитать файл, чтобы найти разрывы строк, поэтому более подходящей является другая функция. fgets будет читать файл по очереди. Бросьте это в петлю и захватите только те строки, которые вы хотите.

Я боялся этого … Думаю, это план Б тогда: S

Для каждого запроса AJAX я собираюсь:

  1. Прочитайте в строке количество строк, которые я собираюсь вернуть клиенту.
  2. Скопируйте оставшуюся часть файла во временный файл.
  3. Вернуть строку клиенту.

Это хромой, и это, вероятно, будет довольно медленным с 10 000 + строк файлов, но я думаю, что это лучше, чем чтение того же снова и снова, по крайней мере временный файл становится короче с каждым запросом … Нет?