2016-11-17 72 views
0

我試圖從txt文件讀取數據到php,我已經能夠做到這一點,但現在它有點不同。 數據文件包含看起來像這樣的列:php - 從txt文件中獲取特定列 - 不規則地分隔列

10.09.16 0:05 16.7 16.8 16.7 70 11.2 3.2 ENE 0.27 6.4 ENE 16.7 16.4 16.4 --- 946.9 0.00 0.0  0  0.00  0  0.0 0.00 0.0 0.006 0.000 19.8 44 7.2 18.7 8.35 1.1146 15.6 0.00 112 2 100.0 5 


10.09.16 0:10 16.7 16.8 16.7 70 11.2 4.8  E 0.40 6.4  E 16.7 16.4 16.4 --- 946.8 0.00 0.0  0  0.00  0  0.0 0.00 0.0 0.006 0.000 19.7 43 6.8 18.6 8.25 1.1151 15.6 0.00 115 2 100.0 5 

正如你看到的,列之間的sepparation並不總是相同的,而不是爲每一列,甚至沒有行之間。

現在我必須從一些特定的列中獲取數據。 有人可以幫助我嗎? 謝謝!

+2

哦,孩子,你需要一些正則表達式的工作。 – Phiter

+0

爲什麼不能簡單地使用正則表達式來按空格拆分行? – arkascha

+0

請[編輯]你的問題,以顯示[你到目前爲止已經嘗試](http://whathaveyoutried.com)。您應該包含您遇到問題的代碼[mcve],然後我們可以嘗試幫助解決特定問題。你還應該閱讀[問]。 –

回答

0

您可以逐行讀取文件,然後用一個空格(或其他分隔符)替換所有空格。

然後用分隔符分隔行以獲得每列的數組。

資源,你可以使用:

讀文件:check this answer

使用str-replace

替換空間使用explode

而且爆炸的陣列,可以通過一些;和使用替代空間fgetcsv

+0

這應該工作,謝謝! –

0

個正則表達式是非常強大的,當涉及到匹配和分離文本序列:

簡單的方法,如果你不知道事先列數:

<?php 

$input = <<<EOT 
10.09.16 0:05 16.7 16.8 16.7 70 11.2 3.2 ENE 0.27 6.4 ENE 16.7 16.4 16.4 --- 946.9 0.00 0.0  0  0.00  0  0.0 0.00 0.0 0.006 0.000 

10.09.16 0:10 16.7 16.8 16.7 70 11.2 4.8  E 0.40 6.4  E 16.7 16.4 16.4 --- 946.8 0.00 0.0  0  0.00  0  0.0 0.00 0.0 0.006 0.000 

EOT; 

$output = []; 
foreach(explode("\n", $input) as $subject) { 
    if (trim($subject)) { 
    preg_match_all('/(?:([^\s]+)\s+)+/uU', $subject, $tokens); 
    $output[] = $tokens[1]; 
    } 
} 

var_dump($output); 

更優雅的方法,如果你知道列數提前:

<?php 

$input = <<<EOT 
10.09.16 0:05 16.7 16.8 16.7 70 11.2 3.2 ENE 0.27 6.4 ENE 16.7 16.4 16.4 --- 946.9 0.00 0.0  0  0.00  0  0.0 0.00 0.0 0.006 0.000 

10.09.16 0:10 16.7 16.8 16.7 70 11.2 4.8  E 0.40 6.4  E 16.7 16.4 16.4 --- 946.8 0.00 0.0  0  0.00  0  0.0 0.00 0.0 0.006 0.000 

EOT; 

preg_match_all('/(?:([^\s]+)\s+)+/uUm', $input, $output); 
$output = array_chunk($output[1], 39); 

var_dump($output); 

爲了降低複雜性,我聲明瞭輸入文本內聯,您可以改爲從文件中讀取它。

這兩種方法都將單獨產生相同的輸出這些行:

array(2) { 
    [0] => 
    array(39) { 
    [0] => 
    string(8) "10.09.16" 
    [1] => 
    string(4) "0:05" 
    [2] => 
... 
    [37] => 
    string(5) "100.0" 
    [38] => 
    string(1) "5" 
    } 
    [1] => 
    array(39) { 
    [0] => 
    string(8) "10.09.16" 
    [1] => 
    string(4) "0:10" 
    [2] => 
... 
    [37] => 
    string(5) "100.0" 
    [38] => 
    string(1) "5" 
    } 
}