php - 从txt文件中获取特定列 - 不规则地分隔列

时间:2016-11-17 10:14:23

标签: php

我试图从txt文件中读取数据到php,我已经能够做到这一点,但现在它有点不同了。 数据文件由以下行组成:

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 

如您所见,列之间的隔离并不总是相同,不是每列都有,甚至不是行之间。

现在我必须从某些特定列中获取数据。 有人可以帮我弄这个吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

您可以逐行读取文件,然后只用一个空格(或其他分隔符)替换所有空格。

然后用分隔符爆炸线以获得每列的数组。

您可以使用的资源:

读取文件:check this answer

使用str-replace

替换空格

使用explode

在阵列中爆炸

此外,您可以用;替换空格并使用fgetcsv

答案 1 :(得分: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"
  }
}