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

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] compteur avec parametres

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] compteur avec parametres

n°657827
mirascheat
Posté le 27-02-2004 à 15:07:18  profilanswer
 

Bonjour,
 
J'ai une fonction qui compte le nombre d'objets ayant certains parametres, dans une liste d'objet avec plusieurs parametres (TYPE, DIR, CAUSE ...)
Jusqu'à maintenant les parametres étaient prédéfinis (TYPE ne peut valoir que 0 ou 1 et ainsi de suite ...) mais maintenant je veux compter avec un parametre supplementaire qui est DURATION mais qui est totalement variable ...  
 
function ticket_multi_count($f, $a)
{
 foreach ($a as $keyword) {
  $g .= "grep $keyword |";
 }
 
 $rc = exec("cat $f | $g grep -c =" );
 return (int)($rc);
}
 
... ancien type de comptabilité
$this->cs_mt_busy=ticket_multi_count($f, array( "TYPE=RELEASE" , "DIR=1", "CAUSE=17" ) );
 
... nouveau avec DURATION mais ca ne pmarche pas?!?
$this->cs_mo_susp=ticket_multi_count($f, array( "TYPE=RELEASE" , "DIR=0", "CAUSE=-1", "DURATION=$dur" and 70<$dur<85) );
 
quelqu'un aurait-il une idée pour m'aider ?!?

mood
Publicité
Posté le 27-02-2004 à 15:07:18  profilanswer
 

n°660926
mirascheat
Posté le 02-03-2004 à 14:17:28  profilanswer
 

bon on simplifie le probleme :
j'ai dans un fichier texte des données comme il suit :
... DUR=70.252 ... DUR=56.252 ... DUR=96.235 ...
je voudrais créer un tableau du type $duration[$time] avec :
$duration[0]=70.252
$duration[1]=56.252 ...

n°660936
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 14:25:44  profilanswer
 

la doc donne:

Code :
  1. preg_match_all("/DUR=((\d+)(\.|)(\d{0,3}))/", $text, $out,  PREG_PATTERN_ORDER);
  2. print_r($out[1]);


 
[edit: planté dans la regex]


Message édité par anapajari le 02-03-2004 à 14:26:30
n°660945
mirascheat
Posté le 02-03-2004 à 14:35:44  profilanswer
 

j'ai fait :
$f='ticketsUE';
preg_match_all("/DUR((\d+)(\.|)(\d{0,3}))/", $f, $out,  PREG_PATTERN_ORDER);  
print_r($out[1]);  
 
résultat :
Array ( )
 
snif snif ca ne marche pas

n°660949
mirascheat
Posté le 02-03-2004 à 14:38:29  profilanswer
 

même en ayant rajouté le "=" ca ne change rien ... je précise que mon ticketsUE.txt et mon toto.php4 sont dans le même répertoire ...

n°660964
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 14:50:11  profilanswer
 

mirascheat a écrit :

j'ai fait :
$f='ticketsUE';
preg_match_all("/DUR((\d+)(\.|)(\d{0,3}))/", $f, $out,  PREG_PATTERN_ORDER);  
print_r($out[1]);  
 
résultat :
Array ( )
 
snif snif ca ne marche pas


:pfff: , ça marche très bien. Par contre je pense qu'il te serait extrêmement instructif d'aller sur http://www.phpdebutant.org et de faire toutes les leçons jusqu'à la 7 ( et surtout celle la)

n°660976
mirascheat
Posté le 02-03-2004 à 15:02:08  profilanswer
 

je ne pense pas que :
$f= fopen("ticketsUE.txt", "r" );
preg_match_all("/DUR=((\d+)(\.|)(\d{0,3}))/", $f, $out,  PREG_PATTERN_ORDER);  
fclose($f);
print_r($out[1]);  
 
suffise vu le résultat :'(

n°660979
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 15:07:51  profilanswer
 

non mais ça a suffit à me dépiter ...  
:cry: Ptain mais tu veux pas faire un éffort et lire la leçon 7 jusqu'au bout.

n°660983
mirascheat
Posté le 02-03-2004 à 15:10:58  profilanswer
 

si si j'ai bien lu la lecon 7 jusqu'au bout et je me suis rendu compte qu'il fallait ouvrir et fermer un fichier pour pouvoir agir dessus.
Par contre l'information que je n'ai pas trouver c'est comment lire la totalité du fichier parce qu'ils indiquent seulement pour un nombre fini de caractère ...
Désolé de t'agacer ... je me désole moi même de mon niveau

n°660987
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 15:13:05  profilanswer
 
mood
Publicité
Posté le 02-03-2004 à 15:13:05  profilanswer
 

n°660991
mirascheat
Posté le 02-03-2004 à 15:18:28  profilanswer
 

et le vainqueur est :
$fp= fopen("ticketsUE.txt", "r" );
$taillefichier=filesize('ticketsUE.txt');
$fichier=fread($fp,$taillefichier);
preg_match_all("/DUR=((\d+)(\.|)(\d{0,3}))/", $fichier, $out,  PREG_PATTERN_ORDER);  
fclose($fp);
print_r($out[1]);
 
merci beaucoup de ta patience Anapajari
Je suis peut être un mec désolant mais je sais dire merci quand il le faut, alors mille merci gars ;)

n°661005
mirascheat
Posté le 02-03-2004 à 15:27:33  profilanswer
 

arg mon fichier est trop grand est j'ai une erreur de ce type :
Fatal error: Maximum execution time of 30 seconds exceeded in ...

n°661025
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 15:44:30  profilanswer
 

c'est marrant mais je sens que tu cherches à faire un truc pour lequel php n'est pas forcément conseilé.
 
Au pire découpe le tout en plusieurs fichiers ...
 

n°661032
mirascheat
Posté le 02-03-2004 à 15:48:37  profilanswer
 

ouaip de toute facon je viens de m'apercevoir que j'avais mal évalué ce que je voulais ...
ce que je veux finalement c'est pas un tableau pour avoir tous les résultats mais je veux simplement faire un traitement sur chaque dur, je veux juste comptabiliser ceux dont la valeur est entre 70 et 85.
Reste plus qu'à trouver comment faire :) !?!
Je n'ai pas le choix du langage, c'est du PHP donc je dois travailler en PHP :(

n°661074
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 16:12:46  profilanswer
 

déjà tu peux améliorer un peu la regex:

Code :
  1. /DUR=(([7|8][0-9])(\.|)(\d{0,3}))/


ainsi elle ne remonte plus que les nombres entre 70.000 et 89.999
 
Après pas d'autres choix que de parcourir le tableau pour regarder lequels sont bien inférieurs à 85...
 
Tu es nux ou windows? PArce que sous nux à doit pouvoir s'en sortir juste à base de grep.
Sinon tu peux pas le faire en perl ?
 
Enfin au pire execute ton php en ligne de commande pour eviter le 'maximum execution time' lié à apache.
 
[edit]
on peut aussi faire ça pour la regex:

Code :
  1. /DUR=((70|71|72|73|74|75|76|77|78|79|80|81|82|83|84)(\.|)(\d{0,3}))/g


Je trouve ça bien cochon mais au moins tu n'as pas a parcourir ton tableau!


Message édité par anapajari le 02-03-2004 à 16:16:15
n°661093
mirascheat
Posté le 02-03-2004 à 16:22:37  profilanswer
 

bein moi je travaille sous windows mais après ca tourne sous unix donc si tu as l'équivalent en grep n'hésite pas :)

n°661147
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 16:48:06  profilanswer
 

sous nux, la commande suivante te donne directement le résultat:

Code :
  1. sed 's/DUR=/\nDUR=/ig' tonfichier | grep -Eci "DUR=((70|71|72|73|74|75|76|77|78|79|80|81|82|83|84)(\.|)(\d{0,3}))"


Message édité par anapajari le 02-03-2004 à 16:48:58
n°661235
mirascheat
Posté le 02-03-2004 à 17:29:59  profilanswer
 

comment le concatener avec les précédentes commandes nux ?
 $rc = exec("cat $f | $g grep -c =" );  
le nom de fichier étant représenter par $f

n°661239
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 17:34:48  profilanswer
 

:sweat: tu m'auras fatigué toi ...
 
la commande que je t'ai donné suffit de l'executer sous nux toute seule en dehors d'un script php pour avoir le nombre d'occurence trouvée.
 
Bon mais si tu en as besoin dasn ton script php:

Code :
  1. $rc = exec(sed 's/DUR=/\nDUR=/ig' $f | grep -Eci "DUR=((70|71|72|73|74|75|76|77|78|79|80|81|82|83|84)(\.|)(\d{0,3}))" );


a oui et note bien que si tu n'as jamais plus d'un DUR=... par ligne dans ton fichier tu n'as pas besoin de toute la partie avec le sed et tu peux juste ecrire:

Code :
  1. $rc = exec("grep -Eci "DUR=((70|71|72|73|74|75|76|77|78|79|80|81|82|83|84)(\.|)(\d{0,3})) $f" );


Message édité par anapajari le 02-03-2004 à 17:35:49
n°661264
mirascheat
Posté le 02-03-2004 à 18:03:37  profilanswer
 

Est-ce que lancer un gunzip avant peut perturber la commande ?!? (oui je sais c'est moi qui suis perturbé!!!)
parce que j'ai fait un  : zcat ticketsUE.txt | grep -Eci "DUR=((70|71|72|73|74|75|76|77|78|79|80|81|82|83|84)(\.|)(\d{0,3}))"
le fichier ticketsUE.txt étant zippé et j'obtiens 0 alors qu'il y a des lignes avec des valeurs de DUR comprises entre 70 et 85 ...

n°661268
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-03-2004 à 18:10:38  profilanswer
 

non aucun probleme, commande suivante testée et approuvée chez moi:

Code :
  1. zcat tonfichier| sed 's/DUR=/\nDUR=/g'  | grep -Eci "DUR=((70|71|72|73|74|75|76|77|78|79|80|81|82|83|84)(\.|)(\d{0,3}))"


sur un fichier contenant

Code :
  1. "DUR=34.567DUR=74.564DUR=23.678DUR=78.657DUR=85.323";


donne le résultat:

Code :
  1. 2


 
[edit: pré-sentiment] montre 2/3 lignes de ce que tu obtiens en faisant ton zcat sur le fichier


Message édité par anapajari le 02-03-2004 à 18:12:24
n°661715
mirascheat
Posté le 03-03-2004 à 09:46:55  profilanswer
 

Quand je fais ca (vu que je n'ai qu'un DUR par ligne):

Code :
  1. zcat tickets.txt.gz | grep -Eci "DUR=((70|71|72|73|74|75|76|77|78|79|80|81|82|83|84)(\.|)(\d{0,3}))"


j'obtiens :

Code :
  1. grep: illegal option - E
  2. Usage: grep -hblcnsviw pattern file


alors j'apprends qu'il y a deux grep donc j'utilise :
/usr/xpg4/bin/grep
malheureusement je trouve en résultat 0, ce qui est faux ...
un exemple d'une partie du fichier ticketsUE.txt

Code :
  1. DATE=2004/02/25-10:09:32.747 TYPE=A
  2. DATE=2004/02/25-10:09:32.757 TYPE=A DUR=84.409
  3. DATE=2004/02/25-10:09:32.777 TYPE=B CAUSE=3

n°661760
mirascheat
Posté le 03-03-2004 à 10:27:11  profilanswer
 

Au fait les expressions regulieres en PHP et sous unix c'est les même ?

n°661869
mirascheat
Posté le 03-03-2004 à 11:36:24  profilanswer
 

Sincerement je pense que l'expression reguliere n'est pas bonne parce que qd je lui demande de me chercher uniquement DUR il me sort une reponse ...

n°661880
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-03-2004 à 11:42:33  profilanswer
 

:cry:
tu noteras que le -E dans grep c'est pour qu'il interprete la pattern comme une regex. Alors si tu fais sans et bien ça cherche exactement la chaine de caractère décrite après.
 
Sinon je te reconfirme par ailleurs que la regex marche très bien.

n°662085
mirascheat
Posté le 03-03-2004 à 14:17:24  profilanswer
 

j'ai reessayé sans le | dans ...(\.|)... et ca marche maintenant ... il reste plus qu'à l'insérer dans mon script ...

n°662088
anapajari
s/travail/glanding on hfr/gs;
Posté le 03-03-2004 à 14:18:21  profilanswer
 

tant mieux mais si tu as DUR=84 bin ça te remontera rien

n°662093
mirascheat
Posté le 03-03-2004 à 14:20:26  profilanswer
 

c'est bizare que juste en enlevant le pipe ca marche ...

mood
Publicité
Posté le   profilanswer
 


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

  [PHP] compteur avec parametres

 

Sujets relatifs
[PHP] Peut on faire un include sans execution du code ?[PHP/MYSQL]Ne peut on pas faire plus simple ?
[PHP][newbie] Génération aléatoire de nombres différents 2 à 2 ?[PHP]Problème avec les Sessions (débutant)
[PHP]Executable[PHP] $this->
[PHP] Safe mode et outils graphique[PHP / MYSQL] textarea : il aime pas les '
[PHP-SQL] selection aleatoire dans une bdd avec un whereInterfacer une BDD Access sur le WEB > ASP ou PHP ?
Plus de sujets relatifs à : [PHP] compteur avec parametres


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