2011-04-09 114 views
0

我需要一個建議。解析文本文件

我需要剪切和解析文本文件(使用貨幣匯率)。下面我們就從這個文件中的小片段:

c057z110323 
h057z110323 
a057z110323 
b012z110323 
c058z110324 
h058z110324 
a058z110324 
c059z110325 
h059z110325 
a059z110325 
c060z110328 
h060z110328 
a060z110328 
c061z110329 
h061z110329 
a061z110329 
c062z110330 
h062z110330 
a062z110330 
b013z110330 
c063z110331 
h063z110331 
a063z110331 
c064z110401 
h064z110401 
a064z110401 
c065z110404 
h065z110404 
a065z110404 
c066z110405 
h066z110405 
a066z110405 
c067z110406 
h067z110406 
a067z110406 
b014z110406 
c068z110407 
h068z110407 
a068z110407 
c069z110408 
h069z110408 
a069z110408 

正如你可以看到有很多線路(在原文件大約有行80000(被添加每天幾行)

字符串格式如下:

A000112233 
where 
A - type 
000 - number of the file (created this year) 
11 - year 
22 - month 
33 - day 

我用下面的代碼片段獲得25個最新行從文件:

$file = "http://www.nbp.pl/kursy/xml/dir.txt"; 
    $data = file($file); 
    $count = count($data); 

    for($i = $count - 25; $i < $count; $i++) 
    { 
     if(substr($data[$i], 0, 1) === 'a') 
     { 
      $latest[] = $data[$i]; 
     } 
    } 

我只需要得到以「a」開頭的行。輸出數組看起來如下:

array(8) { 
    [0]=> 
    string(13) "a062z110330 
" 
    [1]=> 
    string(13) "a063z110331 
" 
    [2]=> 
    string(13) "a064z110401 
" 
    [3]=> 
    string(13) "a065z110404 
" 
    [4]=> 
    string(13) "a066z110405 
" 
    [5]=> 
    string(13) "a067z110406 
" 
    [6]=> 
    string(13) "a068z110407 
" 
    [7]=> 
    string(13) "a069z110408 
" 
} 

現在我需要每個數組元素比較當前日期前得到最新的工作日的最新項目。我正在使用這種方式:

 $i = 1; 
     foreach($latest as $row) 
     { 
      $plural = ($i > 1) ? 's' : null; 

      if(substr(trim($row), -6) === date("ymd", strtotime("-" . $i . " day" . $plural)) 
      { 
       $filename = $row; 
       break; 
      } 

      $i++; 
     } 

它的工作相當好,但我面臨一個大問題。我無法對$latest數組按最近的六個字符排序。我嘗試使用sort(),rsort()來做到這一點。他們沒有一個對我有好處。

任何人都可以幫助我解決這個問題,或者有更好的方法來做我正在尋找的東西。

回答

1

當你

for($i = $count - 25; $i < $count; $i++) 
{ 
    if(substr($data[$i], 0, 1) === 'a') 
    { 
     $latest[] = $data[$i]; 
    } 
} 

使用日期作爲重點在$latest陣列:

for($i = $count - 25; $i < $count; $i++) 
{ 
    if(substr($data[$i], 0, 1) === 'a') 
    { 
     $key = (int) substr($data[$i], -6); 
     $latest[$key] = $data[$i]; 
    } 
} 

然後,您可以通過排序key,如:

ksort($latest); 
1

您需要使用自定義排序方法。您可以使用usort寫你自己的比較函數:http://php.net/manual/en/function.usort.php

從手動

function cmp($a, $b) { 
    if ($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

$a = array(3, 2, 5, 6, 1); 

usort($a, "cmp"); 

比較函數必須返回一個 整數小於,等於,或 大於零,如果第一 的論點被認爲是 分別小於,等於,或者大於第二個的 。

1

既然你」只關心如何通過排序字符串數組他們的最後六個字符:

使用usort

function sortfunc($a, $b) { 
    return strcmp(substr($a, -6), substr($b, -6)); 
} 

usort($latest, 'sortfunc'); 

您可能需要修剪()的第一行或換行和/或回車符將在最後6個字符的一部分。