Самое близкое, что я видел в документах 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 я собираюсь:
Это хромой, и это, вероятно, будет довольно медленным с 10 000 + строк файлов, но я думаю, что это лучше, чем чтение того же снова и снова, по крайней мере временный файл становится короче с каждым запросом … Нет?