Столкновение со странной ситуацией в PHP при анализе файла - PullRequest
0 голосов
/ 13 сентября 2010

Я читаю некоторые строки из файла в следующем формате:

Identifier String Number String Number String Number String Number
Identifier String Number String Number String Number
Identifier String Number String Number 
Identifier String Number String Number String Number String Number String Number

В файле, который мне дали, я считаю, что строки очень очень длинные, поэтому следующий код:

<?php
        $fp = gzopen($filename, "r");
        while($source = gzgets($fp, 4096)) {
                $trans = array("\x0D" => "");
                $source = strtr($source,$trans);
                $source = trim($source);
                $source = explode(' ', $source);

                foreach($source as $value) {
                        $value = trim($value);

                        //Clean and insert into appropriate column
                }
        }
?>

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

while($source = gzgets($fp, 409600)) {

, но тогда мой анализ все еще испорчен для какого-то другого странного случая.Как я могу позаботиться об этом?Есть предложения?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2010

Задачи такого типа легко решить с помощью FSM . В случае с FSM вы определяете несколько состояний, одно из которых «текущий символ равен \ r \ n» - и теперь вы можете читать любым удобным вам способом.

1 голос
/ 13 сентября 2010

Вы можете использовать gzgetc (), чтобы вытягивать каждый символ из файла один за другим, и проверять разрывы строк вручную.Получив полную строку, проанализируйте ее, как обычно.Но вы не говорите, в чем заключается проблема с использованием большего размера строки с gzgets (), поэтому я не могу сказать, поможет ли это или нет.

...