Version complète: sur le forum Webmaster Hub : Compter les 0 et 1 d'un fichier.
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Seb65
Bonsoir,

Je cherche à compter le nombre de 0 et 1 de la seconde colonne d'un fichier texte.
J'appelle seconde colonne la séparation du premier élément par une virgule.

En fait le fichier texte stocke les informations d'Uptime et Downtime d'une adresse ou d'une IP...

Mon fichier texte a la forme suivante (3 colones):

10.0.0.1,0,texte
www.google.fr,1,Google
toto.fr,0,Toto

10.0.0.1 --> première colonne
0 --> seconde colonne
texte --> troisième colonne

Donc je veux lire uniquement sur la seconde colonne le nombre de 0 et 1 afin d'afficher le nombre de 0 et de 1 trouvé dans le fichier.

Merci par avance.
ludo88
si c'est ponctuel : tu peux juste ouvrir ton ficheir avec excel ou un autre tableur et demander qu'il prenne ce fichier pour du csv (peut etr ele renommer en csv) ensuite tu lui demandes de séparer les colonnes par des virgules, après tu as juste les infos que tu veux à toi de les traiter come tu le souhaites

Sinon tu as une bete solution php : tu ouvres le fichier en lecture et tu recupères chaque ligne et avec un petit split tu récupéres ce dont tu as besoin.

Si tu as l'impression que je parle chinois IMSTP6.gif , dis moi si tu as besoin de ce traitement 1 fois ou plusieurs et je préciserai la solution la mieux... biggrin.gif

Ludo
xpatval
CODE
list($var1, $var2, $var3) = split(",",$ligne);
echo $var2;


Dans ce genre là ?

xpatval
Remi
Si le fichier est bien homogène (si tu n'as pas de virgules autres que les séparateurs), on peut aussi faire :
CODE
mb_substr_count(file_get_contents ( "monfichier"  ),',0,');
mb_substr_count(file_get_contents ( "monfichier"  ),',1,');

Un peu bourrin, mais bon... tongue.gif
Seb65
Bonsoir,

Merci pour les réponses.

_AT_ludo88 : En fait non je ne veux pas passer par Excel car cela doit être autonome via php smile.gif

_AT_xpatval : Non je ne pense pas que ce soit cela que je cherche. Mais merci quand même.

_AT_Remi : Oui le fichier est homogène donc je pense que ta solution doit me convenir. Il faut que je puisse savoir combien de fois l'url ou l'IP a été UP (1) ou DOWN (0).

Pourquoi un peu bourrin ? Une solution plus judicieuse ?

Merci a vous trois pour l'aide wink.gif
Remi
Je disais "bourrin" dans le sens où c'est vite fait, mais pas très propre : on compte les ',1,' sans savoir s'ils sont vraiment dans la seconde zone de chaque ligne.
Donc si c'est temporaire, c'est bon mais si c'est du durable, il faut mieux faire cela plus propre car si demain, tu rajoutes d'autres infos à ton fichier... huh.gif
Seb65
Mon fichier est composé de plusieurs colonnes.

Ce qui est sur c'est que le 0 et le 1 seront en seconde position. Par contre la je n'arrive pas a exécuter ton code pour lire la seconde position de chaque ligne blush.gif

CODE
<?php

print mb_substr_count(file_get_contents ( "192.168.0.1.log"  ),',0,');
echo "<br><br>";
print mb_substr_count(file_get_contents ( "192.168.0.1.log"  ),',1,');


?>


Je cherche quand même une solution durable et stable wink.gif
Seb65
Je test cela demain je pense avoir trouvé mon soucis d'affichage. En fait j'ai pas les bons fichiers sous la main.

Donc ',0,' doit fonctionner sans soucis je pense wink.gif
Seb65
Bonjour,

J'ai un petit soucis avec "mes colonnes" blush.gif

Comment forcer le script a lire que la seconde colonne et non après. En fait la il me cumule le résultat des autres colonnes aussi :

Ex :

10.100.0.15,1,1,1,100.00,mardi,23,mai,2006,am,Test
TheRec
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);
Seb65
Bonsoir,

Merci pour ce joli code smile.gif

Il ma l'air très bien fonctionnel. Sauf que... La je vois qu'il lit ligne par ligne et fait ensuite une soustration de ces lignes pour la valeur de "0" unsure.gif

Si j'ai un retour chariot dans mon fichier texte cela va être comptabilisé comme une ligne donc mon résultat va être faussé :nono:

Existe t'il un moyen de supprimer dans ce même code les lignes vide ? Je pense qu'il faudrait que je traite le fichier avant (fopen) avec une fonction qui enlève toute les lignes vide, puis récrit le fichier texte ET enfin utiliser le code de calcul de 0 et 1.

Peut être qu'il y a une autre solution ?

Merci beaucoup.
TheRec
Bonsoir,

tu as raison, c'est même plus facile ainsi... l'expression régulière reste la même. Je n'avais pas compris que ton fichier pouvait contenir des retours de ligne supplémentaires.
Voici le code modifié et ainsi raccourci :
CODE
<?php
 // Récupération du fichier entier dans une chaîne de caractères
 $content = file_get_contents('uptime.log');
 // 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 d'occurrences on obtient le nombre de 0 (même propriété mathématique)
 $zerocount = count($matches[1]) - $onecount;
?>

On utilise le nombre d'occurrences...ce qui est beaucoup plus logique en fait, merci d'avoir trouvé ce bug wink.gif
Seb65
Bonsoir,

A merci bien smartass.gif Oui la cela fonctionne bien même avec des sauts de lignes.

Donc impec pour ce que je voulais faire.

Merci et bonne soirée.

@ bientôt
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.