Отображение двух наборов данных в Perl - PullRequest
1 голос
/ 04 февраля 2011

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

Итак, мне нужно сопоставить UA в двух файлах, а затем получить соответствующую информацию об устройстве из файла, который имеет список. Я дошел до того, что составил список UA в хэше из первого файла и сопоставил его с UA в файле данных. Как я могу получить соответствующую информацию из первого файла, который снова содержит информацию об устройстве, и записать ее в файл?

#!/usr/bin/perl

use warnings;
use strict;

our $inputfile = $ARGV[0];
our $outputfile = "$inputfile" . '.devidx';
our $devid_file = "devid_master";  # the file that has the UA and the corresponding device info
our %ua_list_hash = ();

# Create a list of mobile user agents in the devid_master file
 open DEVID, "$devid_file" or die "can't open $devid_file";

 while(<DEVID>) {
        chomp;
        my @devidfile = split /\t/;
        $ua_list_hash{$devidfile[1]} = 0;
 }  

 open IN,"$inputfile" or die "can't open $inputfile";       
 while(<IN>) {      
       chomp;       
       my @hhfile = split /\t/;       

       if(exists $ua_list_hash{$hhfile[24]}) {     
                     # how do I get the rest of the columns from the devidfile, columns 2...10?
       }
 }

 close IN;

Или есть лучший способ сделать это на Perl? Это всегда приветствуется:).

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

При создании первого поискового хэша, вы не могли бы сохранить ссылку на другие данные столбца в качестве значения хеша, а не просто 0?

#!/usr/bin/perl

use warnings;
use strict;

our $inputfile = $ARGV[0];
our $outputfile = "$inputfile" . '.devidx';
our $devid_file = "devid_master";  # the file that has the UA and the corresponding device info
our %ua_list_hash = ();

# Create a list of mobile user agents in the devid_master file
 open DEVID, "$devid_file" or die "can't open $devid_file";
 while(<DEVID>) {
        chomp;
        my @devidfile = split /\t/;
        # save the columns you'll want to access later and
        # store a reference to them as the hash value
        my @values = @devidfile[2..$#devidfile];   
        $ua_list_hash{$devidfile[1]} = \@values;
 }  

 open IN,"$inputfile" or die "can't open $inputfile";       
 while(<IN>) {      
       chomp;       
       my @hhfile = split /\t/;       

       if(exists $ua_list_hash{$hhfile[24]}) {
           my @rest_of_vals = @{$ua_list_hash{$hhfile[24]};
           # do something with @rest_of_vals
       }
 }

 close IN;

Примечание. Я не проверял это.

0 голосов
/ 04 февраля 2011

Как вы хотите, чтобы ваш вывод выглядел? Список всех уникальных устройств в файле $ input. Или для каждой строки в $ inputfile выведите строку, отображающую, какое это устройство?

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

Если вы знаете, что имена устройств являются элементами 2..10, вы можете использовать операторы slice и join для создания, например, разделенной запятыми строки имен устройств. Эта строка будет значением, назначенным для имени ключа UA.

  #!/usr/bin/perl

    use warnings;
    use strict;

    our $inputfile = $ARGV[0];
    our $outputfile = "$inputfile" . '.devidx';
    our $devid_file = "devid_master";  # the file that has the UA and the corresponding device info
    our %ua_list_hash = ();

    # Create a list of mobile user agents in the devid_master file
     open DEVID, "$devid_file" or die "can't open $devid_file";

     while(<DEVID>) {
            chomp;
            my @devidfile = split /\t/;
            my @slice = @devidfile[2..10];
            my $deviceString = join(",", @slice);
            $ua_list_hash{$devidfile[1]} = $deviceString;
     }  

     my $outputfilename = "output.txt";
     open IN,"$inputfile" or die "can't open $inputfile";
     open OUT,"$outputfilename" or die "can't open $outputfilename";       
     while(<IN>) {      
           chomp;       
           my @hhfile = split /\t/;       

           if(exists $ua_list_hash{$hhfile[24]}) {     
               print OUT $ua_list_hash{$hhfile[24]}."\n";   

           }
     }

 close IN;
 close OUT;
...