2011-04-09 87 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个字符的一部分。