[PHP] compteur avec parametres

compteur avec parametres [PHP] - PHP - Programmation

Marsh Posté le 27-02-2004 à 15:07:18    

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 ?!?

Reply

Marsh Posté le 27-02-2004 à 15:07:18   

Reply

Marsh Posté le 02-03-2004 à 14:17:28    

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

Reply

Marsh Posté le 02-03-2004 à 14:25:44    

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
Reply

Marsh Posté le 02-03-2004 à 14:35:44    

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

Reply

Marsh Posté le 02-03-2004 à 14:38:29    

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

Reply

Marsh Posté le 02-03-2004 à 14:50:11    

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)

Reply

Marsh Posté le 02-03-2004 à 15:02:08    

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 :'(

Reply

Marsh Posté le 02-03-2004 à 15:07:51    

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.

Reply

Marsh Posté le 02-03-2004 à 15:10:58    

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

Reply

Marsh Posté le 02-03-2004 à 15:13:05    

Reply

Marsh Posté le 02-03-2004 à 15:13:05   

Reply

Marsh Posté le 02-03-2004 à 15:18:28    

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

Reply

Marsh Posté le 02-03-2004 à 15:27:33    

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

Reply

Marsh Posté le 02-03-2004 à 15:44:30    

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

Reply

Marsh Posté le 02-03-2004 à 15:48:37    

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

Reply

Marsh Posté le 02-03-2004 à 16:12:46    

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
Reply

Marsh Posté le 02-03-2004 à 16:22:37    

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

Reply

Marsh Posté le 02-03-2004 à 16:48:06    

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
Reply

Marsh Posté le 02-03-2004 à 17:29:59    

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

Reply

Marsh Posté le 02-03-2004 à 17:34:48    

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

Marsh Posté le 02-03-2004 à 18:03:37    

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

Reply

Marsh Posté le 02-03-2004 à 18:10:38    

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
Reply

Marsh Posté le 03-03-2004 à 09:46:55    

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

Reply

Marsh Posté le 03-03-2004 à 10:27:11    

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

Reply

Marsh Posté le 03-03-2004 à 11:36:24    

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

Reply

Marsh Posté le 03-03-2004 à 11:42:33    

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

Reply

Marsh Posté le 03-03-2004 à 14:17:24    

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

Reply

Marsh Posté le 03-03-2004 à 14:18:21    

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

Reply

Marsh Posté le 03-03-2004 à 14:20:26    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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