2012-08-28 81 views
0

我對PHP很陌生,我需要一些關於從文件中爆炸數據的幫助。有問題的文件是:http://data.vattastic.com/vatsim-data.txt抓取和分解數據

基本上,我需要得到的數據下!CLIENTS:部分(底部附近)。有了這些數據,我需要將其爆炸並獲取每個:之間的信息。

我曾嘗試與此代碼,但它給了我一個可變的偏移誤差(Undefined offset: 3

$file = file("http://data.vattastic.com/vatsim-data.txt"); 
foreach($file as $line) 
{ 
    $data_record = explode(":", $line); 

    // grab only the data that has "ATC" in it... 
    if($data_record[3] == 'ATC' && $data_record[16] != '1' && $data_record[18] != '0'&& stristr($data_record[0],'OBS') === FALSE) 
    { 
     rest of code here... 
    } 
} 

如果有人能幫助我,我會非常感激。

+0

使用'var_dump($ data_record)'。問題是'$ data_record'沒有第三個位置 – Gerep

+0

'var_dump($ data_record)'正在返回數據文件中的所有內容。在「!客戶端」部分獲取這些內容的最佳方法是什麼? – Dutchcoffee

+0

看起來像'explode(「:」,$ line);'沒有返回你所期望的。您應該在嘗試訪問它們之前測試'$ data_record'是否具有正確數量的元素 – peacemaker

回答

2

這是因爲你正試圖爆炸這樣行:

; !一般包含一般設置

當爆炸那行,你的$data_records看起來是這樣的:

陣列(! [0] =>;一般包含一般設置)

快速解決方案:

$file = file("http://data.vattastic.com/vatsim-data.txt"); 
foreach($file as $line) 
{ 
    if(strpos($line,';') === 0) continue ; // this is comment. ignoring 
    $data_record = explode(":", $line); 
    $col_count = count($data_record); 

    switch($col_count) { 
    case 42: // columns qty = 42, so this is row from `clients` 
     // grab only the data that has "ATC" in it... 
     if($data_record[3] == 'ATC' && $data_record[16] != '1' && $data_record[18] != '0'&& stristr($data_record[0],'OBS') === FALSE) 
     { 
      rest of code here... 
     } 
     break; 
    default: 
     // this is other kind of data, ignoring 
     break; 
    } 
} 
+0

這似乎很好。我會再測試一下,讓你知道。 – Dutchcoffee

+0

似乎一切工作,因爲它應該。謝謝你的幫助! – Dutchcoffee

0

另一種解決方案是將u請輸入正則表達式並查找!CLIENTS:部分。這也適用於客戶未來有多於或少於42列的情況

$file = file_get_contents ("http://data.vattastic.com/vatsim-data.txt"); 
$matches = null; 
preg_match ('/!CLIENTS:\s\n(.*)\n;/s' , $file, $matches); 
if($matches) 
{ 
    $client_lines = explode("\n", $matches[1]); 
    foreach ($client_lines as $client) 
    { 
    $data_record = explode(":", $client); 
    if($data_record[3] == 'ATC' && $data_record[16] != '1' && $data_record[18] != '0'&& stristr($data_record[0],'OBS') === FALSE) 
    { 
     //rest of code here... 
    } 
    } 
} 
+0

我的正則表達式技巧並不好,但嘗試過,工作正常,但也許有更好的REGEX來解決這個 –

+0

我會記住你的代碼,以防列數發生變化。謝謝! – Dutchcoffee