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

StackOverflow https://stackoverflow.com/questions/514673

  •  21-08-2019
  •  | 
  •  

Вопрос

Самое близкое, что я видел в документации 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 строк, но я думаю, это лучше, чем читать одно и то же снова и снова, по крайней мере, временный файл становится короче с каждым запросом...Нет?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top