comptage (nb max de user a instant t )

comptage (nb max de user a instant t ) - Perl - Programmation

Marsh Posté le 05-01-2004 à 22:37:33    

Bsoir a tous !
Je voudrais avant tout remercier tous ceux qui m ont aider a repondre a toutes les questions que je me posais ...et surtout vous souhaitez une hyper mega BONNE ANNEE 2004 ... bcp de sante bonheur .Et chaleur ds ton corps ... Bref c pas le sujet ...  
 
Je reviens pour une question :  
j ai un fichier genre ..  
 
utilisateur; heure ( hh:mm:ss:miliseconde)  
 
Et des lignes comme ca y en a une tripote dans mon fichiers .  
Le but es de sortir le nombre de "utilisateur" max a un instant "heure"  
 
Je me suis construit un tableau ..classique ... mais seulement je ne trouve pas le traitement que je dois lui appliquer pour sortir ce qu on veut .  
 
L'un de vous aurait une idee par hasard ...  
Merci  

Reply

Marsh Posté le 05-01-2004 à 22:37:33   

Reply

Marsh Posté le 06-01-2004 à 00:10:49    

Si tu ne veut que le nombre de "utilisateur" max a un instant "heure" tu peux t'en sortir avec uen tructure Perl, mais si tu commence à avoir besoin d'autres requetes tu aura interet à passer tout ca dans une BDD et poser tes requetes en SQL
 
Pour ton probleme particulier, tu peux faire une hash table avec comme clé heure, et que tu increment à chaque fois:
 
my %nb_utilisateurs;
while (my $ligne = <IN> ) {
  my ($utilisateur, $heure) = split(/\s*;\s*, $ligne);
  $nb_utilisateurs{$heure}++;
}

Reply

Marsh Posté le 06-01-2004 à 08:30:11    

Effectivement la meilleur solution aurait ete d avoir  un BDD Mais l architecture qu'il y a ne le permet pas .Le bout de code ci-dessus ne me renvoie pas le resultat attendu ..

Reply

Marsh Posté le 06-01-2004 à 18:16:01    

Citation :

Et des lignes comme ca y en a une tripote dans mon fichiers .  
Le but es de sortir le nombre de "utilisateur" max a un instant "heure"


 
Tu pourrais préciser si tu veux connaître le nombre maximal d'utilisateur étant enregistré à une heure précise (donc par exemple entre 17h00 et 18h00) ou le nombre maximal d'utilisateur dans un écart de temps d'une heure (par exemple 17h15 17h30 17h45 18h00 18h15 18h45 ... le max se trouve entre 17h15 et 18h15 ou 17h30 et 18h30 si on exclu la borne sup).
 
Dans les 2 cas, le traitement est différent :/

Reply

Marsh Posté le 06-01-2004 à 18:27:28    

Ben en fait ce que je veux sortir c le nombre d'utilisateur maximum a un instant donne .. c a la seconde car ... sur une seconde j'ai enormement de transaction . exemple de ligne :  
 
utilisateur2;HH:MM:SS
utilisateur2;HH:MM:SS
utilisateur1;HH:MM:SS
utilisateur1;HH:MM:SS
utilisateur1;HH:MM:SS
utilisateur2;HH:MM:SS
utilisateur2;HH:MM:SS
utilisateur1;HH:MM:SS
utilisateur2;HH:MM:SS
utilisateur2;HH:MM:SS
utilisateur2;HH:MM:SS
utilisateur3;HH:MM:SS
etc ... et a une HH:MM:SS donnee je veux donner le nombre d'utilisateurs different , pour calculer le max .  
Pour info c un peu pour determiner a quelle hh:mm:ss de la journee j ai un max

Reply

Marsh Posté le 06-01-2004 à 19:50:04    

Dernière question, ces lignes sont triées par ordre d'heure hh:mm:ss ou elles peuvent être dans le désordre ? Si c'est en ordre, c'est tout simple mais sinon je pense qu'il faut passer par un tableau.

Reply

Marsh Posté le 06-01-2004 à 19:52:57    

vu que ces lignes sont extraites d'une log de cache , elles sont triees . dans ordre croissant de HH:MM:SS

Reply

Marsh Posté le 06-01-2004 à 20:34:19    

Voilà par exemple :
 

Code :
  1. <?php
  2. $FileName = "donnee.dat";
  3. if ($FileHandle = fopen ($FileName, "r" )) {
  4. $PeakHours = array ();
  5. $PeakLevel = 0;
  6. $CurrentHour = "";
  7. $Counter = 0;
  8. while (!feof ($FileHandle)) {
  9.  $Entry = explode (";", fgets ($FileHandle));
  10.  if ($Entry[1] == $CurrentHour) {
  11.   $Counter ++;
  12.  } else {
  13.   if ($Counter > $PeakLevel) {
  14.    $PeakHours = array ($CurrentHour);
  15.    $PeakLevel = $Counter;
  16.   } else if ($Counter == $PeakLevel) {
  17.    array_push ($PeakHours, $CurrentHour);
  18.   }
  19.   $CurrentHour = $Entry[1];
  20.   $Counter = 1;
  21.  }
  22. }
  23. fclose ($FileHandle);
  24. }
  25. print_r ($PeakHours);
  26. echo $PeakLevel;
  27. ?>


 
Et en plus ça gère si il y a plusieurs heures qui ont le même pic ... la liste des heures est dans $PeakHours (un tableau) et le nombre d'utilisateurs à ce moment là est $PeakLevel;
Il lit directement le fichier ... dont le nom est dans $FileName.

Reply

Marsh Posté le 06-01-2004 à 21:31:16    

Euh ...euh ..suis embarasse ..c en perl que je cherche ...connais pas le php

Reply

Marsh Posté le 06-01-2004 à 21:51:30    

yannvi a écrit :

Euh ...euh ..suis embarasse ..c en perl que je cherche ...connais pas le php


 
Ho zut désolé, je sais pas pourquoi j'étais embarqué dans PHP :D
Je vais voir ça en Perl mais c'est pas grandement différent normalement ;)
 
Disons que l'algorithme est identique


Message édité par Tentacle le 06-01-2004 à 21:52:04
Reply

Marsh Posté le 06-01-2004 à 21:51:30   

Reply

Marsh Posté le 06-01-2004 à 22:24:33    

yannvi a écrit :

Effectivement la meilleur solution aurait ete d avoir  un BDD Mais l architecture qu'il y a ne le permet pas .Le bout de code ci-dessus ne me renvoie pas le resultat attendu ..  


 
je te dit pas que le bout de code va marcher directe, c'etait juste pour donner l'idée
 
en gros, si tes lignes sont sous la forme
utilisateur2;HH:MM:SS  
utilisateur2;HH:MM:SS  
utilisateur1;HH:MM:SS  
utilisateur1;HH:MM:SS  
utilisateur1;HH:MM:SS  
utilisateur2;HH:MM:SS  
utilisateur2;HH:MM:SS  
 
pour chaque ligne tu met l'heure (complete, tout ce qui est apres ;) dans un variable $heure, et tu fais:
 
$compteur{$heure}++;
 
donc cette hash table te donne le nombre d'utilisateur à chaque HH:MM:SS  
 
ensuite pour connaitre les pics tu classe les clés (c'est à dire les heures) par l'ordre des valurs (c'est à dire le nombre d'utilisateur associés)
 
donc ca donne un truc du genre :
 
(j'ai pas ecrit explicitement la boucle et l'extraction de $heure vu que ca dépend de ton script)
 

Code :
  1. my %compteur;
  2. #la tu fais ta boucle sur les lignes de ton log
  3.   # pour chaque ligne de ton log, tu extrait $heure et tu fais:
  4.   $compteur{$heure}++;
  5. # fin de ta boucle de lecture du log
  6. # maintenant on va classer tout ca
  7. @classement_decroissant = sort{$compteur{$b} <=> $compeur{$a}} keys %compteur;
  8. #normalement $classement_decroissant[0] te donne l'heure du max:
  9. print "heure du pic: $classement_decroissant[0]\n";
  10. print "deuxieme heure la plusfréquentée: $classement_decroissant[1]\n";
  11. # et evidement pour connaitre le nombre effectif d'utilisateur alors en ligne il suffit de faire:
  12. print "Au max à $classement_decroissant[0] on a eu $compteur{$classement_decroissant[0]} utilisateur\n";
  13. $compteur{$classement_decroissant[0] }


Reply

Marsh Posté le 06-01-2004 à 22:37:38    

yannvi a écrit :

Euh ...euh ..suis embarasse ..c en perl que je cherche ...connais pas le php


 
Voilà en Perl =)

Code :
  1. use strict;
  2. my $FileName = "donnee.dat";
  3. open DATAFILE, "<$FileName" or die "Cannot open file '$FileName' : $!\n";
  4. my @PeakHours = ();
  5. my $PeakLevel = 0;
  6. my $CurrentHour = "";
  7. my $Counter = 0;
  8. my $Line = "";
  9. while ($Line = <DATAFILE> ) {
  10. chomp $Line;
  11. my @Data = split /;/, $Line;
  12. if ($Data[1] eq $CurrentHour) {
  13.  $Counter ++;
  14. } else {
  15.  if ($Counter > $PeakLevel) {
  16.   @PeakHours = ($CurrentHour);
  17.   $PeakLevel = $Counter;
  18.  } elsif ($Counter == $PeakLevel) {
  19.   push @PeakHours, $CurrentHour;
  20.  }
  21.  $CurrentHour = $Data[1];
  22.  $Counter = 1;
  23. }
  24. }
  25. close DATAFILE;
  26. foreach my $Hour (@PeakHours) {
  27. print $Hour . "\n";
  28. }
  29. print $PeakLevel;


 
La partie à la fin étant juste pour afficher le résultat ;)

Reply

Marsh Posté le 06-01-2004 à 23:34:47    

c bien ce que j'avais fais merci pour l'aide ... j'avais un c ...ille sur le tri en fait et je ne triais pas ce qu il fallait...  
Bref ...merci

Reply

Sujets relatifs:

Leave a Replay

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