[Perl] Lecture de fichier+calcul en fct indx
Résolu
Mrkanter
-
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21506 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
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
4 réponses
-
Salut,
Les champs sont toujours séparés par | ?
Il y a toujours une valeur correspondante dans la deuxième ligne?!
-
Re,
Encore une chose.
La 1ère ligne peut contenir des doublons?!
Par exemple avoir ABC123 deux fois. -
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. -
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