在解析文件时面对PHP中的奇怪情况

时间:2010-09-13 03:37:16

标签: php parsing file

我正在以下列格式从文件中读取一些行:

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
                }
        }
?>

正在产生解析错误,即我没有得到预期的列。当我期待一个String时,它会给我一个数字,当我想要一个数字时,它会返回一个标识符。经过几个小时的调试,现在我发现4096的缓冲区大小无法读取真正的长行,因此它只读取部分行,然后在下一次迭代中读取下一个块,因为内部for循环是搞砸了。我尝试给出一个大的缓冲区值:

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

然后我的解析仍然搞砸了其他一些奇怪的情况。我怎么处理这个?有什么建议吗?

2 个答案:

答案 0 :(得分:2)

使用FSM可以轻松解决此类任务。在FSM的情况下,您定义了几个状态,其中一个状态是“当前字符是\ r \ n” - 现在您可以以任何您喜欢的方式自由阅读。

答案 1 :(得分:1)

您可以使用gzgetc()逐个从文件中提取每个字符,并手动检查换行符。一旦你有一个完整的行,就像平时那样解析它。但是你没有说使用gzgets()使用更大的行大小是什么问题,所以无论这是否有帮助,我都不能说。