Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
929 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Résolu][Perl]Regrouper, compter et additionner

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu][Perl]Regrouper, compter et additionner

n°2195311
Sethenssen
Posté le 24-06-2013 à 08:18:40  profilanswer
 

Bonjour,
 
J'ai tout un script qui me permet d'avoir ce résultat.
Cela représente:
date, heure et minute|une carte|la quantité|un volume de donnée
 

Code :
  1. 201306190000|TEST_U.317|1|3000000
  2. 201306190000|TEST_U.317|1|3750000
  3. 201306190000|TEST_U.372|1|3750000
  4. 201306190001|TEST_U.313|1|3400000
  5. 201306190001|TEST_U.315|1|3750000
  6. 201306190001|TEST_U.317|1|3000000
  7. 201306190001|TEST_U.372|1|3000000
  8. 201306190002|TEST_U.315|1|3750000
  9. 201306190002|TEST_U.317|1|3000000
  10. 201306190002|TEST_U.317|1|4000000
  11. 201306190002|TEST_U.372|1|4000000
  12. 201306190003|TEST_U.315|1|3750000


 
Il ne me reste plus qu'une dernière étape qui est de regrouper ces données pour les additionner  
Exemple:

Code :
  1. 201306190000|TEST_U.317|1|3000000
  2. 201306190000|TEST_U.317|1|3750000


Cette première ligne est sur la même ligne de temps et concerne la même carte.
Il faut donc additionner la quantité car nous en avons 2 et additionner le volume de donnée.
 
Ce qui doit donner:

Code :
  1. 201306190000|TEST_U.317|2|6750000
  2. 201306190000|TEST_U.372|1|3750000
  3. 201306190001|TEST_U.313|1|3400000
  4. 201306190001|TEST_U.315|1|3750000
  5. 201306190001|TEST_U.317|1|3000000
  6. 201306190001|TEST_U.372|1|3000000
  7. 201306190002|TEST_U.315|1|3750000
  8. 201306190002|TEST_U.317|2|7000000
  9. 201306190002|TEST_U.372|1|4000000
  10. 201306190003|TEST_U.315|1|3750000


 
Je ne sais pas pourquoi mais j'ai du mal avec cette dernière étape alors que cela doit être tout simple avec un hash je suppose.
Si quelqu'un peut m'aider,
Merci par avance.


Message édité par Sethenssen le 25-06-2013 à 08:51:32
mood
Publicité
Posté le 24-06-2013 à 08:18:40  profilanswer
 

n°2195323
gilou
Modérateur
Modzilla
Posté le 24-06-2013 à 13:01:10  profilanswer
 

Bon, il y a peut être mieux, mais ceci devrait faire l'affaire:
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my %hash;
  7. # utilisation de DATA juste pour le test, afin de tout avoir en un fichier
  8. while (<DATA> ) {
  9.  chop;
  10.  my @fields = split '\|', $_;
  11.  $hash{$fields[0]}{$fields[1]} //= [0, 0];
  12.  $hash{$fields[0]}{$fields[1]}->[0] += $fields[2];
  13.  $hash{$fields[0]}{$fields[1]}->[1] += $fields[3];
  14. }
  15.  
  16. foreach my $k1 (sort (keys %hash)) {
  17.  foreach my $k2 (sort (keys %{$hash{$k1}})) {
  18.    print $k1, "|", $k2, "|", $hash{$k1}{$k2}->[0], "|", $hash{$k1}{$k2}->[1], "\n";
  19.  }
  20. }
  21.  
  22.  
  23. __DATA__
  24. 201306190000|TEST_U.317|1|3000000
  25. 201306190000|TEST_U.317|1|3750000
  26. 201306190000|TEST_U.372|1|3750000
  27. 201306190001|TEST_U.313|1|3400000
  28. 201306190001|TEST_U.315|1|3750000
  29. 201306190001|TEST_U.317|1|3000000
  30. 201306190001|TEST_U.372|1|3000000
  31. 201306190002|TEST_U.315|1|3750000
  32. 201306190002|TEST_U.317|1|3000000
  33. 201306190002|TEST_U.317|1|4000000
  34. 201306190002|TEST_U.372|1|4000000
  35. 201306190003|TEST_U.315|1|3750000


 
A+,


Message édité par gilou le 24-06-2013 à 14:36:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2195381
Sethenssen
Posté le 25-06-2013 à 08:51:04  profilanswer
 

Bonjour,
Merci Gilou !
 
J'ai une question car je ne comprends pas cette ligne

Code :
  1. $hash{$k1}{$k2}->[0]


Peux-tu me dire ce qu'elle fait exactement?

n°2195393
gilou
Modérateur
Modzilla
Posté le 25-06-2013 à 10:34:42  profilanswer
 

la structure de donnée est ainsi
%hash est un hash de hash dont la valeur est une référence à une liste comme indiqué ici
$hash{$fields[0]}{$fields[1]} //= [0, 0]
soit quand l'entrée n'est pas définie
$hash{$fields[0]}{$fields[1]} = [0, 0]
en perl, [...] note une référence à une liste (anonyme)
 
$hash{$k1}{$k2} est donc une référence à une liste
$hash{$k1}{$k2}->[0] est la première valeur de la liste.
bref c'est la même chose que @{$hash{$k1}{$k2}}[0]
 
A+,


Message édité par gilou le 25-06-2013 à 10:41:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Résolu][Perl]Regrouper, compter et additionner

 

Sujets relatifs
installation activate perl version 5.16 sous linuxRegrouper plusieur excel dans un seul .xlsx
script perl[Résolu][Perl] Découper un fichier en plusieurs et optimisation
Faire échap en expectComparaison avec perl
perl + comparaison + xmlFaire un bouton coloré PERL GTK2
exécution script Perl sous mac impossiblecompter sous matlab
Plus de sujets relatifs à : [Résolu][Perl]Regrouper, compter et additionner


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR