Rechercher : dans
Par :

[Perl]-Tableau assoc à 2 dimensions

Dernière réponse le 9 oct 2007 à 20:01:20 blux, le 9 oct 2007 à 15:59:24 
 Signaler ce message aux modérateurs

Bonjour,

j'ai une liste de données que j'aimerais agréger pour faire un tableau croisé, mais je ne sais pas coment on gère les tableaux asociatifs à deux dimensions en perl.

Un exemple, en entrée (dans un tableau) :

baie taille machine (entêtes de colonnes pour info)
A 50 machine1
A 20 machine1
B 5 machine1
A 5 machine2
C 10 machine2

en sortie je voudrais la somme de la deuxième colonne par machine et par baie :

machine A B C (entêtes de colonnes pour info)
machine1 70 5 0
machine2 5 0 10

J'ai imaginé créer un tableau à double entrée, mais je souhaiterais faire les additions de manière rapide sans avoir à parcourir le tableau à chaque fois. J'ai donc été voir du côté des tableaux associatifs qui semblent être la réponse à mon besoin, mais j'ai un peu de mal à comprendre comment faire tourner tout ça, et bien sûr je suis susceptible de rajouter des colonnes d'un traitement à l'autre...

Merci d'avance pour l'aide.
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Meilleures réponses pour « [Perl] Tableau assoc à 2 dimensions » dans :
Concaténer les vecteurs ou les matrices sous Matlab VoirL'opération de concaténation des variables de Matlab consiste à regrouper ces variables dans une seule (vecteur ou matrice). Exemple : |2 3 4| X= |1 2 5| |0 2 7| Avec : |9 6 8| Y= |5 6 2| |3 2 1| Donne...
Langage C - Les tableaux VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
Les tableaux en langage C++ VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...

1

lami20j, le 9 oct 2007 à 16:25:46

Salut,

je vais voir ça ce soir ;-) lami20j

Répondre à lami20j

2

blux, le 9 oct 2007 à 16:34:00

Cool !

merci d'avance, je patiente...
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

3

lami20j, le 9 oct 2007 à 17:21:56

Re,
voilà,

#!/usr/bin/perl
use strict;use warnings;

my %h;

while(<DATA>){
  /(\w+)\s*(\w+)\s*(\w+)/;
  push @{$h{$3}{$1}},$2;
  push @{$h{$3}{'A'}},0 unless exists $h{$3}{'A'};
  push @{$h{$3}{'B'}},0 unless exists $h{$3}{'B'};
  push @{$h{$3}{'C'}},0 unless exists $h{$3}{'C'};
}

print "machine A B C\n";
for my $k(keys %h){
  print "$k";
  for my $kk(sort keys %{$h{$k}}){
    print " ",eval ( join "+",@{$h{$k}{$kk}});
  }
  print "\n";
}
__END__
A 50 machine1
A 20 machine1
B 5 machine1
A 5 machine2
C 10 machine2

Resultat
root@debian:~/src# perl blux.pl
machine A B C
machine1 70 5 0
machine2 5 0 10
--
lami20j

Répondre à lami20j

4

 lami20j, le 9 oct 2007 à 20:01:20

et bien sûr je suis susceptible de rajouter des colonnes d'un traitement à l'autre...

tu peux établir le nombre de colonnes (voir le tableau @col)

lami20j@debian:~/trash$ cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;

my %h;
my $l;
my @col = 'A' .. 'F';
while(<DATA>){
  next if /^$/;
  /(\w+)\s*(\w+)\s*(\w+)/;
  push @{$h{$3}{$1}},$2;

  for $l(@col){
    push @{$h{$3}{$l}},0 unless exists $h{$3}{$l};
  }
}

print "machine @col\n";
for my $k(keys %h){
  print "$k";
  for my $kk(sort keys %{$h{$k}}){
    print " ",eval ( join "+",@{$h{$k}{$kk}});
  }
  print "\n";
}
__END__
A 50 machine1
A 20 machine1
B 5 machine1
A 5 machine2
C 10 machine2
A 50 machine1
A 20 machine1
B 5 machine1
A 5 machine2
C 10 machine2
D 50 machine1
D 20 machine1
E 5 machine1
F 5 machine2
C 10 machine2
A 50 machine1
A 20 machine1
B 5 machine1
A 5 machine2
C 10 machine2

lami20j@debian:~/trash$ perl ccm.pl
machine A B C D E F
machine1 210 15 0 70 5 0
machine2 15 0 40 0 0 5
lami20j

Répondre à lami20j