Aller au contenu

Compter les 0 et 1 d'un fichier.


Sujets conseillés

Posté

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.

Posté

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 :fou: , dis moi si tu as besoin de ce traitement 1 fois ou plusieurs et je préciserai la solution la mieux... :D

Ludo

Posté

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

Dans ce genre là ?

xpatval

Posté

Si le fichier est bien homogène (si tu n'as pas de virgules autres que les séparateurs), on peut aussi faire :

mb_substr_count(file_get_contents ( "monfichier"  ),',0,');
mb_substr_count(file_get_contents ( "monfichier"  ),',1,');

Un peu bourrin, mais bon... :P

Posté

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

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

Posté

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:

Posté

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:

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

Posté

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

Posté

Bonjour,

J'ai un petit soucis avec "mes colonnes" :blush:

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

Posté

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 :

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

  preg_match_all('/^[^,]+,[01],(0|1)/im',$content,$matches);

Posté (modifié)

Bonsoir,

Merci pour ce joli code :)

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:

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.

Modifié par Seb65
Posté

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 :

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

Posté

Bonsoir,

A merci bien :smartass: 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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...