繁体   English   中英

解析文本文件

[英]Parsing Text File

我需要个建议。

我需要抓取并解析文本文件(用于货币汇率)。 这是该文件的一小段代码:

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()进行此操作。 他们都没有为我工作。

任何人都可以帮助我解决这个问题,或者有更好的方法来完成我要找的事情。

您需要使用自定义排序方法。 您可以使用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");

如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。

当你做

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

使用date作为$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);

由于您只问如何按字符串的最后六个字符排序:

使用usort

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

usort($latest, 'sortfunc');

您可能需要先修剪()行,否则换行符和/或回车符将成为最后6个字符的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM