繁体   English   中英

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

[英]php - get specific column from txt file - columns separated irregularly

我正在尝试从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 

如您所见,列之间的分隔并不总是相同的,不是每列都一样,甚至行之间也不一样。

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

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

然后用分隔符将行炸开,以获得每列的数组。

您可以使用的资源:

读取文件: check this answer

使用str-replace替换空间

使用explode在阵列中explode

另外,您可以用一些替换该空格; 并使用fgetcsv

在匹配和分隔文本序列时,正则表达式非常强大:

如果您事先不知道列数,则采用简单方法:

<?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"
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM