[Perl] Lecture de fichier+calcul en fct indx

Résolu
Mrkanter -  
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

voilà mon problème, je dois lire dans un fichier 2 lignes:
la première ressemble à ça:
ABC123|ABC456|DEF987|DEF654|DEF321...
La 2 eme ligne correspond aux valeurs de la 1 e ligne:
10|2|54|65|12

je dois regrouper les noms de la premiere ligne si les 3 premieres lettres sont identiques, (ABC: ABC123, ABC456 et DEF: DEF987, DEF654, DEF321), ABC devra contenir le total des ABC soit ABC=10+2=12 idem pour DEF, DEF=54+65+12=131.

Je ne sais absolument pas comment procéder (je débute en Perl). Pouvez vous m'aidez ?

Merci
A voir également:

4 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Les champs sont toujours séparés par | ?
Il y a toujours une valeur correspondante dans la deuxième ligne?!
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

Encore une chose.
La 1ère ligne peut contenir des doublons?!
Par exemple avoir ABC123 deux fois.
0
Mrkanter
 
Les champs sont toujours séparés par |.
Non, il ne peut pas y avoir de doublons et oui il y a toujours une valeur sur la deuxième ligne qui correspond au nom de la première.
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

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

my(@l,@n,%h,%somme);

while(<DATA>){
  chomp;
  @l=split /\|/ if /^[A-Z]/;
  @n=split /\|/ if /^[0-9]/;
}

@h{@l}=@n;

foreach (sort keys %h){
  /^(...)/;
  push @{$somme{$1}},$h{$_};
}
foreach (sort keys %somme){
  my $s = join "+",@{$somme{$_}};
  $s=~s/\s*//g;
  print "$_ = $s = ",eval $s,"\n";
}
__END__
ABC123|ABC456|DEF987|DEF654|DEF321
10|2|54|65|12
lami20j@debian:~/trash/ccm_perl$ perl somme_lig.pl
ABC = 10+2 = 12
DEF = 12+65+54 = 131
0