我有一个txt文件,其中包含有关特定日期的每小时风参数的数据,请参阅此文件的链接
在这个第一个小时的数据,即00:00:00,来自第一行。我想要从第3行的日期和时间,从第5行的括号中的稳定性等级值以及从第12行的第5和第6列的风速和方向。我知道如何获取数据并以这种方式编码。
<?php
$file_handle = fopen("201017.dat", "r");
$line_no=0;
while (!feof($file_handle)) {
$line = fgets($file_handle);
$line_no++;
if($line_no==3 ){
$data=explode("\t",$line);
$date=$data[0];
$time=date('H:i:s',strtotime($data[1]));
}
if ($line_no==5 ) {
preg_match('/(?<=\()(.+)(?=\))/is', $line, $match);
$stability= $match[0];
}
if ($line_no==12 ) {
$data=explode("\t",$line);
$speed= $data[4];
$dir= $data[5];
}
}
$values[]="('$date', '$time',$dir,$speed,'$stability')";
现在我需要推送到数组的下一小时数据来自第一行。 31,33和40.我可以使用if .... else,如果对于整个24块数据我觉得这是一个繁琐的过程。有没有办法简化这一点,因为行号在算术级数上有一个共同的差异为28
答案 0 :(得分:0)
$arr = file('201017.dat'); // read the whole file into array
/* NOTE! The whole file will be loaded into RAM,
so take into account ram restrictions for big files.
In this case 90kb is very small size */
$n = count($arr);
/* start with 2, because array indexes start with 0,
so the 3rd line will have index 2.
On the next interation $i will be 30 (that is 31th line,
$i+2 will be 33th line, $i+9 will be 40th line, etc.) */
for ($i = 2; $i < $n; $i += 28)
{
$data=explode("\t", $arr[$i]);
$date=$data[0];
$time=date('H:i:s',strtotime($data[1]));
preg_match('/(?<=\()(.+)(?=\))/is', $arr[$i+2], $match); // i+2 gives 5th line
$stability= $match[0];
$data=explode("\t", $arr[$i+9]);
$speed = $data[4];
$dir = $data[5];
$values[]="('$date', '$time',$dir,$speed,'$stability')";
}
var_dump($values);
/*
Shows:
[0]=>
string(52) "('10/20/2017', '00:00:00', 220.00, 1.39,'D')"
[1]=>
string(52) "('10/20/2017', '01:00:00', 215.00, 0.15,'E')"
[2]=>
string(52) "('10/20/2017', '02:00:00', 199.00, 0.95,'D')"
[3]=>
string(52) "('10/20/2017', '03:00:00', 203.00, 1.03,'D')"
..... etc.
*/