2016-11-17 70 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" 
    } 
}