Как сравнить два столбца хеш-таблицы - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть два файла CSV:

Файл1

System,name,plan,run
A123,mev,28,12
B123,fsa,31,45
C345,ghd,52,34

Файл2

System,name,plan,run
A123,mev,20,10
B123,fsa,32,43
C345,ghd,54,34

Я хочу узнать, какие системные идентификаторы используются совместнодва файла, и из этих систем, в чем разница между количеством тестов "запустить".Например, File1 и File2 оба имеют общую систему C345, а разница между счетчиками их выполнения равна нулю (у обоих по 34 прогона).

Мой код:

my @csv_file = qw| path/tofile1 path/tofile2 |;

opne $f, '<', $csv_file, or die;

foreach $csv_file ( @csv_file ) {

    my %hash;

    while ( my $line = <$f> ) {

        my ($system, $name, $plan, $run) = split(",", $line);
        $hash{$system} = [ $owner, $plan, $run ];

        if ( $run > $plan ) {
            print "More run than planned $system\n"; # prints B123
        }

        if ( $system eq $system ) {
            print "Matching systems: $system\n"; # prints 'System, A123, B123, C345'
        }
    }
}

Мне удалось распечатать, какие системы существуют в обоих файлах, но я не могу понять, как взять эти повторяющиеся системы и сравнить их значения 'run' друг с другом.

1 Ответ

0 голосов
/ 20 сентября 2018

Обычно для такого рода вещей я предлагаю DBD :: CSV и относиться к файлам csv как к таблицам базы данных.Но пришло время для чего-то другого: используя Tie :: CSV_File , чтобы файлы выглядели как двумерные массивы.Установите модуль с вашим любимым клиентом CPAN, если менеджер пакетов вашей ОС не предоставляет его.(split недостаточно надежен для синтаксического анализа CSV общего назначения, и в CPAN доступно множество лучших опций.)

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use Tie::CSV_File;

tie my @file1, "Tie::CSV_File", "file1.csv";
tie my @file2, "Tie::CSV_File", "file2.csv";

my %runs = map { $_->[0] => $_->[3] } @file1[1 .. $#file1];

for my $row (@file2[1 .. $#file2]) {
  my $sys = $row->[0];
  if (exists $runs{$sys}) {
    my $diff = $runs{$sys} - $row->[3];
    say "$sys run difference: $diff";
  }
}

Выполнение этого на входе примера дает:

A123 run difference: 2
B123 run difference: 2
C345 run difference: 0

Он выполняет итерацию по первому CSV-файлу, сохраняя систему и столбцы прогона в виде хеш-таблицы, а затем перебирает второй, просматривая систему второго в этом хэше и получая разницу двух значений прогона.

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