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

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

Marsh Posté le 24-06-2013 à 08:18:40    

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
Reply

Marsh Posté le 24-06-2013 à 08:18:40   

Reply

Marsh Posté le 24-06-2013 à 13:01:10    

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é!  --
Reply

Marsh Posté le 25-06-2013 à 08:51:04    

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?

Reply

Marsh Posté le 25-06-2013 à 10:34:42    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed