Как читать несколько файлов параллельно? - PullRequest
2 голосов
/ 19 июля 2010

У меня есть несколько текстовых файлов, которые мне нужно открыть, а затем выделить определенные поля для установки строк внутри PHP для последующей записи в MySQL.

Каждый текстовый файл имеет одно и то же уникальное значение для app_id, например,

Таким образом, текстовый файл 1 имеет

app_id название описание

текстовый файл 2 имеет

app_id категория

текстовый файл 3 имеет

app_id цена

Я хочу получить имя, описание, категорию и цену для каждой записи и записать это в mysql.

Я могу прочитать первый, используя код:

$fp = fopen('textfile1','r');
if (!$fp) {echo 'ERROR: Unable to open file.</table></body></html>'; exit;}
while (!feof($fp)) {
$line = stream_get_line($fp,4096,$eoldelimiter); 
if ($line[0] === '#') continue;  //Skip lines that start with # 
 $field[$loop] = explode ($delimiter, $line);
list($app_id, $name, $description) = explode($delimiter, $line);
 $fp++;
}

fclose($fp);
?> 

У меня вопрос, как читать 2-й и 3-й файлы? Могу ли я как-то сделать это параллельно, или мне нужно закончить чтение текстового файла 1, записать каждую строку в mysql, затем открыть текстовый файл 2 и записать категорию в mysql, используя replace в ключе app_id, затем сделать то же самое с открытием текстового файла 3 а?

Ответы [ 3 ]

0 голосов
/ 19 июля 2010

Просто откройте все три файла в последовательности и затем в вашем цикле while есть три stream_get_line, по одному на каждый файл:

$ fp1 = fopen ('textfile1', 'r');

$ fp2 = fopen ('textfile2', 'r');

$ fp3 = fopen ('textfile3', 'r');

while (! feof ($ fp1)){

$ line1 = stream_get_line ($ fp1 ...)

$ line2 = stream_get_line ($ fp2 ...)

$ line3 = stream_get_line ($ fp3 ...)

...

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

0 голосов
/ 19 июля 2010

Попробуйте это:

     file1.txt contents:
            id 13 category test description test
    file2.txt:
       id 13 name test description test
       id 15 name test description test
       id 17 name test description test


    $files = array('file1.txt','file2.txt');

            foreach($files as $file) {
                flush();
                preg_match_all("/id\s(?<id>\d+)\s(?:name|category|price)?\s(?<name>[\w]+)\sdescription\s(?<description>[^\n]+)/i",@file_get_contents($file),$match);
                    print_r($match);
            }

returns:
Array
(
    [0] => Array
        (
            [0] => id 13 category test description test
        )

    [id] => Array
        (
            [0] => 13
        )

    [1] => Array
        (
            [0] => 13
        )

    [name] => Array
        (
            [0] => test
        )

    [2] => Array
        (
            [0] => test
        )

    [description] => Array
        (
            [0] => test
        )

    [3] => Array
        (
            [0] => test
        )

)
Array
(
    [0] => Array
        (
            [0] => id 13 name test description test
            [1] => id 15 name test description test
            [2] => id 17 name test description test
        )

    [id] => Array
        (
            [0] => 13
            [1] => 15
            [2] => 17
        )

    [1] => Array
        (
            [0] => 13
            [1] => 15
            [2] => 17
        )

    [name] => Array
        (
            [0] => test
            [1] => test
            [2] => test
        )

    [2] => Array
        (
            [0] => test
            [1] => test
            [2] => test
        )

    [description] => Array
        (
            [0] => test
            [1] => test
            [2] => test
        )

    [3] => Array
        (
            [0] => test
            [1] => test
            [2] => test
        )

)
0 голосов
/ 19 июля 2010

Я бы рекомендовал следующий подход:

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

    if (!isset($array[$app_id])) $array[$app_id] = new MyClass();

    array[$app_id]->name = $name;

    array[$app_id]->description = $description;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...