Соответствующие элементы из 2 массивов в Perl - PullRequest
0 голосов
/ 31 мая 2010

Прямо сейчас я пытаюсь синхронизировать два файла данных, которые перечислены по дате, чтобы я мог сделать сравнения позже. Однако я не могу распечатать только строки, где совпадают даты. На данный момент я разделил данные для каждого файла на 2 массива. Мне нужно найти только даты в обоих массивах и распечатать их. Любые предложения будут высоко оценены.

Вот пример набора необработанных данных, с которыми я работаю, каждый файл имеет одинаковый формат:

09/11/2009,00:56:00,51.602,47.894,87,88,0,1032
09/12/2009,00:56:00,57.794,55.796,93,54,0,1023.6
09/13/2009,00:56:00,64.292,62.204,93,66,0,1014.4
09/14/2009,00:56:00,61.592,55.4,80,25,0,1009.6
09/15/2009,00:56:00,58.604,53.798,84,31,0,1009.1
09/16/2009,00:56:00,53.6,48.902,84,45,0,1017

Я разбил дату на массив для каждого файла. Моя конечная цель - печатать только те строки кода, в которых оба файла содержат данные. Поэтому для этого я хотел сравнить 2 массива с элементами, являющимися датами.

Мой исходный код выглядел так:

foreach $bdate(@bdate){
while (<PL>){
    chomp;
    @arr = split (/,/);
    $pday=$arr[1];
    push @pdate, $pday;
    if ($bdate eq $pdate){
        print "$bdate,$pday\n";
    }
}

Ответы [ 3 ]

4 голосов
/ 31 мая 2010

Один из многих способов состоит в том, чтобы проходить один раз по каждому массиву, создавая хэш следующим образом:

for (@array1, @array2) {
    $dates{$_}++;
}

Затем вы можете распечатать ключи, которые соответствуют значениям 2 или более;

print $_,"\n" for grep {$dates{$_} > 1} keys %dates;

(не проверено, написано на машине без Perl)

... и быстрый CPAN поиск включается Список :: Сравнить , с этим примером;

$lc = List::Compare->new(\@Llist, \@Rlist);

@intersection = $lc->get_intersection;
1 голос
/ 31 мая 2010

Вот пример из perlfaq4 (немного упрощенный):

my (@intersection, %count);

for my $element (@array1, @array2) { $count{$element}++ }

for my $element (keys %count) {
    push @intersection, $element if $count{$element} > 1;        
}

Более идиоматическая версия:

my (%union, %isect);
for my $e (@array1, @array2) { $union{$e}++ && $isect{$e}++ }

my @intersection = keys %isect;

Оба метода предполагают, что каждый элемент уникален взаданный массив.

0 голосов
/ 31 мая 2010

Вы против использования внешней функции Unix "comm"?

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