我有大量的数据,如下所示:
PHHI GFSX MOS GUIDANCE 10/19/2012 1200 UTC
FHR 24 36| 48 60| 72 84| 96 108|120 132|144 156|168 180|192
SAT 20| SUN 21| MON 22| TUE 23| WED 24| THU 25| FRI 26|SAT CLIMO
N/X 66 80| 68 82| 66 82| 66 81| 66 80| 67 82| 67 81| 67999999
TMP 69 79| 71 81| 69 80| 69 80| 69 79| 69 80| 70 80| 70
DPT 63 64| 66 63| 64 64| 65 64| 65 66| 66 68| 68 65| 66
WND 11 10| 10 12| 11 9| 9 8| 8 8| 8 8| 8 7| 7
P12 8 9| 11 9| 21 14| 20 10| 18 20| 28 28| 46 15| 32999999
P24 14| 19| 14| 23| 19| 36| 40| 999
Q12 0 0| 0 0| 0 0| 0 0| 0 0| 1 1| |
Q24 0| 0| 0| 0| 0| 1| |
PHJH GFSX MOS GUIDANCE 10/19/2012 1200 UTC
FHR 24 36| 48 60| 72 84| 96 108|120 132|144 156|168 180|192
SAT 20| SUN 21| MON 22| TUE 23| WED 24| THU 25| FRI 26|SAT CLIMO
N/X 999 84|999 84|999 84|999 85|999 84|999 84|999 84|999999999
TMP 999 83|999 82|999 83|999 83|999 83|999 83|999 83|999
........etc
我需要在PHP中处理它,以便将它放入MYSQL数据库。
在第一行中,需要第一个单词(电台名称),并且需要日期/时间。
根本不需要第二行和第三行。 |
字符无关紧要。
最后两列是有问题的:
192
SAT CLIMO
67999999
70
66
7
32999999
999
这些数字相互接触,但实际上它们是两个独立的变量。看起来应该更像这样:
192
SAT CLIMO
67 999999
70
66
7
32 999999
999
有关如何解析此问题的任何提示?是否有用于解析固定宽度数据的附件函数?
答案 0 :(得分:2)
这是在O' Reilly PHP Cookbook中回答的经典PHP问题。
Parsing Fixed-Width Delimited Data
substr
运行正常。但是,unpack
是我最喜欢的,因为它在下面使用C函数并且速度更快。
答案 1 :(得分:1)
你可以尝试
$file = "log.txt";
$list = $part = array();
foreach ( file($file) as $line ) {
$line = trim($line);
if (strpos($line, "|") === false) {
continue;
}
$line = explode("|", $line) and $line = end($line);
$list[] = substr($line, 0, 3) . " " . substr($line, 3);
}
var_dump($list);
输出
array
0 => string '192 ' (length=4)
1 => string 'SAT CLIMO' (length=10)
2 => string ' 67 999999' (length=10)
3 => string ' 70 ' (length=4)
4 => string ' 66 ' (length=4)
5 => string ' 7 ' (length=4)
6 => string ' 32 999999' (length=10)
7 => string ' 999' (length=10)
8 => string ' ' (length=1)
9 => string ' ' (length=1)
10 => string '192 ' (length=4)
11 => string 'SAT CLIMO' (length=10)
12 => string '999 999999' (length=10)
13 => string '999 ' (length=4)
答案 2 :(得分:1)
过去我使用substr()函数从特定字段中获取数据:
http://php.net/manual/en/function.substr.php
例如:
//Index:
012345678
192
SAT CLIMO
67999999
70
66
7
32999999
999
对于第一栏,我有类似的内容:
while($line = fgets($file)){
$column1 = substr($line, 0, 3);
$column2 = substr($line, 3, 6);
}
// for the line 32999999, you get:
// $column1 = 32
// $column2 = 999999
您可以使这些索引成为常量,并且必须使用它来使其正确地进行一些字符计数,但它将解决一起运行的数字问题。
答案 3 :(得分:-1)
我会在这里使用fscanf
功能。