如何在 PHP 中解析固定宽度的文本文件?

Mik*_*der 2 php parsing

我有大量数据,如下所示:

 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
Run Code Online (Sandbox Code Playgroud)

我需要用 PHP 处理它,以便将它放入 MYSQL 数据库中。

在第一行中,需要第一个单词(电台名称)和日期/时间。第二行和第三行根本不需要。性格|无关紧要。最后两列有问题:

192      
SAT CLIMO
 67999999
 70      
 66      
  7      
 32999999
      999
Run Code Online (Sandbox Code Playgroud)

这些数字相互接触,但实际上它们是两个独立的变量。它应该看起来更像这样:

192      
SAT CLIMO
 67 999999
 70      
 66      
  7      
 32 999999
      999
Run Code Online (Sandbox Code Playgroud)

关于如何解析这个有什么建议吗?是否有解析固定宽度数据的辅助函数?

Dev*_*evy 5

这是 O'Reilly PHP Cookbook 中回答的一个经典 PHP 问题。

解析固定宽度分隔数据

substr工作正常。然而,unpack这是我最喜欢的,因为它在底层使用 C 函数并且速度更快。