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

  FORUM HardWare.fr
  Programmation
  Perl

  comptage (nb max de user a instant t )

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comptage (nb max de user a instant t )

n°603339
yannvi
Posté le 05-01-2004 à 22:37:33  profilanswer
 

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  

mood
Publicité
Posté le 05-01-2004 à 22:37:33  profilanswer
 

n°603477
pospos
Posté le 06-01-2004 à 00:10:49  profilanswer
 

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}++;
}

n°603600
yannvi
Posté le 06-01-2004 à 08:30:11  profilanswer
 

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 ..

n°604112
Tentacle
Posté le 06-01-2004 à 18:16:01  profilanswer
 

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 :/

n°604115
yannvi
Posté le 06-01-2004 à 18:27:28  profilanswer
 

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

n°604175
Tentacle
Posté le 06-01-2004 à 19:50:04  profilanswer
 

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.

n°604179
yannvi
Posté le 06-01-2004 à 19:52:57  profilanswer
 

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

n°604224
Tentacle
Posté le 06-01-2004 à 20:34:19  profilanswer
 

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.

n°604254
yannvi
Posté le 06-01-2004 à 21:31:16  profilanswer
 

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

n°604276
Tentacle
Posté le 06-01-2004 à 21:51:30  profilanswer
 

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
mood
Publicité
Posté le 06-01-2004 à 21:51:30  profilanswer
 

n°604309
pospos
Posté le 06-01-2004 à 22:24:33  profilanswer
 

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] }


n°604315
Tentacle
Posté le 06-01-2004 à 22:37:38  profilanswer
 

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 ;)

n°604346
yannvi
Posté le 06-01-2004 à 23:34:47  profilanswer
 

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


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

  comptage (nb max de user a instant t )

 

Sujets relatifs
[MySQL] sortir la liste des bases accessibles à un user?[ MySQL ] Problème d'user
[PERL LDAP] Ajout d'un user dans un group[MySQL] Access denied to user 'ocbase@localhost' to database 'mysql'.
[PHP] authentifier un user windows (XP)[script] l'ajout massif d'user dans active directory, ca se script ?
Comment récupérer le login/password d'un user NT ?[MySQL-Newbie] Les droits accordés à un user....
[Administration MySQL] La table user nettoyéeaide pour faire du user friendly!
Plus de sujets relatifs à : comptage (nb max de user a instant t )


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