TheRec
mardi 23 mai 2006 à 12:33
Bonjour,
il est normal que le code qui a été proposé précédemment compte également les zéros et uns des colonnes suivante, car la chaîne recherché est ",[0 ou 1]," et ce "masque" se retrouve dans les autres colonnes de ton fichier...
Il faut utiliser les expressions rationnelles pour avoir des masques plus efficaces, qui prennent compte du début et fin de ligne, etc.
Voici ce que je te propose :
CODE
<?php
// Récupération du fichier entier dans un tableau
$lines = file('uptime.log');
// Obtention du nombre de ligne, pour effectuer le calcul après
$linecount = count($lines);
// Concaténation de toutes les cellules du tableau, les retours de ligne sont conservé, la fonction "file" ne les enlève pas
$content = implode("",$lines);
// Récupération de toutes les occurrences de 0 ou 1 en deuxième colonne.
preg_match_all('/^[^,]+,(0|1),/im',$content,$matches);
// La somme des cellules des occurrences trouvés te donne le nombre de 1 trouvés (propriété mathématique entre 1 et 0)
$onecount = array_sum($matches[1]);
// Si on soustrait ce nombre au nombre de ligne on obtient le nombre de 0 (même propriété mathématique)
$zerocount = $linecount - $onecount;
?>
Tout d'abord il faut se pencher sur l'option "m" utilisée dans l'expression rationnelle, elle permet traiter le chaîne comme plusieurs lignes (qui ont chacune un début et une fin), c'est ce qui permet de définir par la suite un point de repère pour chaque ligne afin d'identifier ta deuxième colonne.
L'expression rationnelle est composée comme suit, la première partie défini que l'occurrence devra
commencer (par ligne) par tout caractère n'étant pas une virgule, cela implique qu'il doit y avoir d'abord une valeur. Ensuite il y a la première virgule, puis un sous-masque avec deux valeurs alternatives (0 ou 1), puis une virgule.
Si tu devais par exemple compter les 0 et 1 de la troisième colonne tu pourrais procéder ainsi :
CODE
preg_match_all('/^[^,]+,[01],(0|1)/im',$content,$matches);