Perl Очистка данных: Как построить список дубликатов имен и получить количество имен? - PullRequest
0 голосов
/ 25 апреля 2020

Я уже задавал такой же вопрос 2 недели go, но я имею дело с другим типом файла, и я не могу сделать это: мои данные - список лошадей; каждая строка соответствует лошади с кучей информации. Некоторые лошади стоят на нескольких линиях, потому что они мчались несколько раз. Я хотел бы, для каждой лошади, составить список своих гонщиков и узнать, сколько гонщиков у каждой лошади. Вот ссылка с моими данными: https://docs.google.com/spreadsheets/d/1qNYEtu2HbPj3S2WAPwnFxxRxAQ1rWAkdlcl1rppEcQw/edit?usp=sharing

Я создал код, чтобы сделать это: Первая часть моего кода позволяет мне иметь список гонщиков; но для лошади один и тот же всадник написан несколько раз. Я не могу найти способ иметь дублированный список гонщиков. Кроме того, со второй частью моего кода я не могу получить количество гонщиков, потому что «строка не может быть использована в качестве массива» ...

Есть ли другой способ получить число гонщики? Как удалить имя всадника, уже записанное в списке?

Вот мой код:

open (Endurance_Output, "F: /endurance_output.txt") || d ie "Can не открывать файл! "; my $ k = 1;

while () {

chomp (my $line=$_);

next if 1..$k==$.;  #Skip X number of lines

my ($Name, $sex, $date_of_birth, $Sire, $Dam, $Age, $type, $date, $distance, $arrival_time, $time_of_entry, $average_speed, $puls, 
$speed_at_gate_30, $speed_at_gate_60, $speed_at_gate_90, $speed_at_gate_120, $average_speed_at_distance_30, $average_speed_at_distance_60, 
$average_speed_at_distance_90, $average_speed_at_distance_120, $rank, $all_horses, $temperature, $differences_in_hills, $rider) = split (/\t/, $line); 


if ($Name =~ /\w+/){ #BUILD A LIST OF RIDERS NAME
            if ($rider =~ /\w+/) {

                    if (($jockeys_by_horse -> {$Name} -> {Rider}) && ($jockeys_by_horse -> {$Name} -> {Rider} !~ /$rider/)){
                        $jockeys_by_horse -> {$Name} -> {Rider} .= ",$rider";
                    } elsif ((!$jockeys_by_horse -> {$Name} -> {Rider})) {
                        $jockeys_by_horse -> {$Name} -> {Rider} = "$rider";
                    }

            }
        }


my $numriders = 0;
my $jockey = "Trainer Not Listed";

if ($jockeys_by_horse -> {$Name}){ #COUNT THE NUMBERS OF RIDERS
    $jockey = $jockeys_by_horse -> {$Name} -> {Rider};
    my @jockey = split /,/, $jockey;
    $numriders = $#$jockey+1; # Count the number of riders with names
}

# Trainer hash - Number of trainers & trainer names
$riderhash -> {$Name} -> {Rider} = "$numriders\t$jockey";

Спасибо за помощь,

...