2010-09-13 38 views
0

我讀從一個文件中的一些行的格式如下:面臨PHP一個奇怪的情況在解析文件

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)) { 

但我的解析仍然搞砸了一些其他奇怪的情況。我該如何照顧這件事?有什麼建議麼?

+0

字符串列中是否可以包含空格?如果是這樣,他們是如何引用的? – Lee 2010-09-13 03:50:34

+0

@李:他們不能包含空格。剛剛解決了這個問題。原來,我正在實施我的分析器不正確。 – Legend 2010-09-13 04:01:28

回答

2

這種類型的任務很容易用FSM來解決。在FSM中,您定義了幾個狀態,其中之一是「當前字符是\ r \ n」 - 現在您可以隨意以任何方式閱讀。

+0

+1,謝謝。我想我必須因爲錯過FSM點而瘋狂:) – Legend 2010-09-13 04:00:20

1

您可以使用gzgetc()將每個字符逐個拉出文件,並手動檢查換行符。一旦你有一個完整的線路,像往常一樣解析它。但是你不會說使用gzgets()使用更大的行尺寸會帶來什麼問題,所以不管這樣做是否有用,我都不能說。

+0

+1爲gzgetc。謝謝。我實現了一個簡單的FSM並解決了這個問題。 – Legend 2010-09-13 04:00:58