2011-03-01 7 views
1

J'ai un fichier qui se compose de ce qui suit:Obtenir toutes les clés pour les éléments répétés correspondant

 
A 1 
A 2 
B 3 
B 4 
B 5 
B 6 
C 7 
A 8 

Je veux obtenir des clés uniques dans la première colonne, mais obtenir toutes les valeurs correspondant à cette clé unique, à savoir que j'ai besoin pour obtenir:

 
A 1,2,8 
B 3,4,5,6 
C 7 

Quelle serait la meilleure façon de faire cela?
(je l'ai entendu dire que Perl a un bon support pour résoudre ce problème, mais je suis nouveau à Perl.)

Répondre

3

Vous voulez probablement un hachage, où chaque valeur dans le hachage est un tableau reference.

my %values; 
while (<>) { 
    my ($left, $right) = split(/ /,$_,2); 
    my $array = $values{$left}; 
    if (!$array) { 
     $array = []; 
     $values{$left} = $array; 
    } 
    push(@{$array},$right); 
} 

Vous pouvez vérifier que cela a produit la structure de données correcte avec Data::Dumper:

use Data::Dumper; 
print Dumper(\%values); 
+0

Vous ne pouvez pas créer de référence * list *, vous pouvez cependant créer une référence * tableau *. Et non, ils ne sont pas tout à fait la même chose. –

+0

Assez juste (fixe) –

+0

Je pense que vous voulez dire 'if (! $ Array)' ... mais en général, ce type de codage n'est pas nécessaire en raison de l'autovivification des types de conteneur par Perl. Vous pouvez remplacer chaque ligne de la boucle while en dessous de la division par 'push @ {$ values ​​{$ left}}, $ right' comme le montre l'exemple d'erickb. –

8

essayez ceci:

open my $fh, '<', "data_filename"; 
my %map; 

while(my $line = <$fh>) { 
    my ($key, $val) = split(/\s+/, $line); 
    push @{$map{$key}}, $val; 
} 
+1

Merci Brad pour votre temps à répondre. – Ravishankar

0

Ceci est juste une autre solution possible pour un souci d'exhaustivité. Dans ce cas, le hachage stocke la clé et une chaîne contenant vos valeurs.


use warnings; 
use strict; 

my %hash =(); 
open (FILE, "input.txt") or die ""; 
while(FILE>){ 
chomp; 
(my $key, my $value) = split; 
    $value = ",".$value if exists $hash{$key}; 
    $hash{$key}.= $value; 
} 

foreach my $key (sort keys %hash){ 
    print "$key $hash{$key}\n"; 
} 

Comme toujours, il existe plusieurs façons de le faire.

+0

Merci beaucoup Cooper. – Ravishankar

+0

Cela ne mettrait pas les numéros dans l'ordre si, donc si l'ordre est important, utilisez le tableau anonyme dans une implémentation de hachage. – Cooper

Questions connexes