Seb65 Posté 22 Mai 2006 Partager Posté 22 Mai 2006 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
ludo88 Posté 22 Mai 2006 Partager Posté 22 Mai 2006 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 , dis moi si tu as besoin de ce traitement 1 fois ou plusieurs et je préciserai la solution la mieux... Ludo Lien vers le commentaire Partager sur d’autres sites More sharing options...
xpatval Posté 22 Mai 2006 Partager Posté 22 Mai 2006 list($var1, $var2, $var3) = split(",",$ligne);echo $var2; Dans ce genre là ? xpatval Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remi Posté 22 Mai 2006 Partager Posté 22 Mai 2006 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... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Seb65 Posté 22 Mai 2006 Auteur Partager Posté 22 Mai 2006 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Remi Posté 22 Mai 2006 Partager Posté 22 Mai 2006 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... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Seb65 Posté 22 Mai 2006 Auteur Partager Posté 22 Mai 2006 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 <?phpprint 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Seb65 Posté 22 Mai 2006 Auteur Partager Posté 22 Mai 2006 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Seb65 Posté 23 Mai 2006 Auteur Partager Posté 23 Mai 2006 Bonjour, J'ai un petit soucis avec "mes colonnes" 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheRec Posté 23 Mai 2006 Partager Posté 23 Mai 2006 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); Lien vers le commentaire Partager sur d’autres sites More sharing options...
Seb65 Posté 23 Mai 2006 Auteur Partager Posté 23 Mai 2006 (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" Si j'ai un retour chariot dans mon fichier texte cela va être comptabilisé comme une ligne donc mon résultat va être faussé 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é 23 Mai 2006 par Seb65 Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheRec Posté 23 Mai 2006 Partager Posté 23 Mai 2006 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Seb65 Posté 27 Mai 2006 Auteur Partager Posté 27 Mai 2006 Bonsoir, A merci bien 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant