Обрабатывать структурированные данные в базе данных из гигантского текстового файла с помощью PHP? - PullRequest
0 голосов
/ 22 марта 2012

У меня есть текстовые файлы, содержащие структурированные данные (это проприетарный формат, а не что-то простое или распространенное, например, CSV). Я пытаюсь поместить эти данные в базу данных. Размер текстовых файлов составляет 50 ГБ, поэтому я не могу прочитать весь файл в памяти, извлечь его в массив и затем обработать в базе данных.

Текстовые файлы структурированы таким образом, что данные о конкретном «элементе» (конкретном идентификаторе в базе данных) могут содержать несколько строк (новых строк) информации в текстовом файле. Элементы в текстовом файле всегда начинаются со строки, которая начинается с '01' и может иметь бесконечное количество дополнительных строк (все одна за другой), которые будут начинаться с 02 или 03 ... до 08. Новый пункт начинается, когда новая строка начинается с 01.

01some_data_about_the_first_item
02some_more_data_about_the_first_item
05more_data_about_the_first_item
01the_first_line_of_the_second_item

Я бы хотел использовать PHP для обработки этих данных.

Как я могу загрузить часть этого текстового файла в память, где я могу проанализировать его, получить все строки для элемента и затем обработать его? Есть ли способ загрузить все строки до следующей строки, которая начинается с 01, обработать эти данные, а затем начать следующее сканирование текстового файла в конце последнего сканирования?

Обработка данных, как только я загрузил их в память, не является проблемой.

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Конечно. Поскольку вы пометили вопрос csv, я предполагаю, что у вас есть файл CSV. В этом случае fgetcsv - это хорошая функция, которая получает одну строку из файла за раз . Используя это, вы можете получить столько строк, сколько вам нужно для одной записи, затем обработать ее, а затем перейти к следующей. Грубый макет:

$fh = fopen('file.csv', 'r');
$record = array();

do {
    $line = fgetcsv($fh);

    if ($line && $line[0] != '01') {
        // any line that does not start with 01 is part of the current record,
        // adjust condition as necessary
        $record[] = $line;
    } else if ($record) {
        /* put current $record into database */

        // start next record
        $record = array($line);
    }
} while ($line);
1 голос
/ 22 марта 2012

Вот начало:

<?php
$fp=fopen('big.txt','r');

while($line=fgets($fp)){
    $number=substr($line,0,2);
    $data=substr($line,2);

    // proccess each line
    echo $number.' - '.$data;
}
fclose($fp);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...