2012-10-19 39 views
2

我有一個看起來像這樣的數據的巨量:如何在PHP中解析一個固定寬度的文本文件?

PHHI GFSX MOS GUIDANCE 10/19/2012 1200 UTC      
FHR 24 36| 48 60| 72 84| 96 108|120 132|144 156|168 180|192  
     SAT 20| SUN 21| MON 22| TUE 23| WED 24| THU 25| FRI 26|SAT CLIMO 
N/X 66 80| 68 82| 66 82| 66 81| 66 80| 67 82| 67 81| 67999999 
TMP 69 79| 71 81| 69 80| 69 80| 69 79| 69 80| 70 80| 70  
DPT 63 64| 66 63| 64 64| 65 64| 65 66| 66 68| 68 65| 66  
WND 11 10| 10 12| 11 9| 9 8| 8 8| 8 8| 8 7| 7  
P12 8 9| 11 9| 21 14| 20 10| 18 20| 28 28| 46 15| 32999999 
P24  14|  19|  14|  23|  19|  36|  40|  999 
Q12 0 0| 0 0| 0 0| 0 0| 0 0| 1 1|  |   
Q24  0|  0|  0|  0|  0|  1|  |   

PHJH GFSX MOS GUIDANCE 10/19/2012 1200 UTC      
FHR 24 36| 48 60| 72 84| 96 108|120 132|144 156|168 180|192  
     SAT 20| SUN 21| MON 22| TUE 23| WED 24| THU 25| FRI 26|SAT CLIMO 
N/X 999 84|999 84|999 84|999 85|999 84|999 84|999 84|999999999 
TMP 999 83|999 82|999 83|999 83|999 83|999 83|999 83|999  
........etc 

我需要處理在PHP,使得它可以被放置到MySQL數據庫。

在第一行中,需要第一個單詞(站名)和日期/時間。 第二和第三行根本不需要。 |字符是無關緊要的。 最後兩列是有問題的:

192  
SAT CLIMO 
67999999 
70  
66  
    7  
32999999 
     999 

的數字互相接觸,但實際上他們是2個獨立的變量。它應該看起來更像這樣:

192  
SAT CLIMO 
67 999999 
70  
66  
    7  
32 999999 
     999 

有關如何解析此問題的任何提示?有解析固定寬度數據的附件功能嗎?

+1

固定寬度使得它非常容易解析,這有什麼問題?只是子串。 – TheZ

回答

1

您可以嘗試

$file = "log.txt"; 
$list = $part = array(); 

foreach (file($file) as $line) { 
    $line = trim($line); 
    if (strpos($line, "|") === false) { 
     continue; 
    } 
    $line = explode("|", $line) and $line = end($line); 
    $list[] = substr($line, 0, 3) . " " . substr($line, 3); 
} 
var_dump($list); 

輸出

array 
    0 => string '192 ' (length=4) 
    1 => string 'SAT CLIMO' (length=10) 
    2 => string ' 67 999999' (length=10) 
    3 => string ' 70 ' (length=4) 
    4 => string ' 66 ' (length=4) 
    5 => string ' 7 ' (length=4) 
    6 => string ' 32 999999' (length=10) 
    7 => string '  999' (length=10) 
    8 => string ' ' (length=1) 
    9 => string ' ' (length=1) 
    10 => string '192 ' (length=4) 
    11 => string 'SAT CLIMO' (length=10) 
    12 => string '999 999999' (length=10) 
    13 => string '999 ' (length=4) 
+0

這不是解析固定數據的解決方案。它在分隔符上分裂。 Muck與列,它仍然工作。這不是合同。如上所述,指定每列的列開始和長度,並使用substr()。 – iJames

1

在過去,我已經使用SUBSTR()函數從特定字段獲取數據:

http://php.net/manual/en/function.substr.php

例如:

//Index: 



192  
SAT CLIMO 
67999999 
70  
66  
    7  
32999999 
     999 

對於我不得不像第一列:

while($line = fgets($file)){ 

    $column1 = substr($line, 0, 3); 
    $column2 = substr($line, 3, 6); 
} 

// for the line 32999999, you get: 
// $column1 = 32 
// $column2 = 999999 

可以使這些指標常量和將發揮與它周圍,以得到正確的先用一些字符計數,但它將解決數字一起運行的問題。

2

這是一個在O'Reilly PHP Cookbook中回答的經典PHP問題。

Parsing Fixed-Width Delimited Data

substr工作正常。但是,unpack是我最喜歡的,因爲它在底下使用C函數,速度更快。

相關問題