Как прочитать файл из строки x в строку y (с помощью php) - PullRequest
0 голосов
/ 14 сентября 2011

Я исследовал весь интернет, чтобы найти решение; но все они пренебрегают важной проблемой. Лучшее решение было в переполнении стека:

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

Но, как и в случае других подходов, для начала необходимо выполнить чтение с начала файла, чтобы достичь линии смещения. Обычно это незначительно; но для больших файлов (скажем, миллионов строк) это значительно замедляет процесс. Время монотонно увеличивается с увеличением смещения. Если вы установите смещение в миллионы, время обработки составит несколько секунд.

В базах данных (например, mysql) мы индексируем таблицу, чтобы прочитать строку, не просматривая всю базу данных. Есть ли сделать это с ключом файла (номер строки)? Интересно, как базы данных плоских файлов, такие как SQLite и Berkeley DB, индексируют свои таблицы.

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

Нет способа искать конкретную строку, потому что термин «строка» - это просто соглашение. Строка - это «набор символов, разделенных \ n». И файл не имеет представления об этом соглашении. Таким образом, чтобы получить N-ю строку, вам нужно пересечь char по char, чтобы подсчитать необходимое количество строк.

Как вы упомянули - вы можете улучшить производительность, используя какой-то созданный пользователем индекс (например, row number - offset in bytes список), но для его создания вам все равно нужно проанализировать файл.

1 голос
/ 14 сентября 2011

Концептуальная проблема здесь заключается в том, что файлы - это просто строки символов, некоторые из этих символов обозначают концы строк. Из-за этого невозможно знать, где начинаются и заканчиваются строки, не прочитав файл вначале.

Если файл нужно читать постоянно, сначала вы сканируете файл и записываете смещения для строк в какой-то индекс и используете fseek () и fread () читать именно те строки, которые вы хотите.

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

0 голосов
/ 14 сентября 2011
<?php

    $strings = file_get_contents($file);

    $length= strlen($strings);

    for($i=0;$i<$length;$i++) {
        print $strings{$i};
    }

?>

Приведенный выше код будет получать содержимое файла в строках, а затем будет перебирать каждый символ один за другим, теперь вам решать, как вы хотите их использовать.

...