Разбор текстового файла - PullRequest
       1

Разбор текстового файла

0 голосов
/ 09 апреля 2011

Мне нужен совет.

Мне нужно просмотреть и проанализировать текстовый файл (используя для курсов валют). Вот небольшой фрагмент этого файла:

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];
        }
    }

Мне нужно получить только строки, начинающиеся с "а". Выходной массив выглядит следующим образом:

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 (). Никто из них не помог мне.

Может кто-нибудь помочь мне с этой проблемой или, может быть, есть лучший подход, чтобы сделать то, что я ищу.

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Когда вы делаете

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 голос
/ 09 апреля 2011

Поскольку вы спрашиваете, как отсортировать массив строк по последним шести символам:

Используйте usort :

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

usort($latest, 'sortfunc');

Возможно, вам потребуетсяОбрезайте () ваши строки первыми или символы новой строки и / или возврата каретки будут частью последних 6 символов.

1 голос
/ 09 апреля 2011

Вам необходимо использовать пользовательский метод сортировки.Вы можете использовать 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");

Функция сравнения должна возвращать целое число меньше чем, равное,или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...