probleme pour lire un fichier texte avec script php

probleme pour lire un fichier texte avec script php - PHP - Programmation

Marsh Posté le 01-02-2007 à 21:44:18    

Bonjour a tous,
j'ai fais ce code pour qu'il lise un fichier texte, et, si une chaine du fichier contient (en 1ere lettre) la lettre X (par exemple),  
alors le script affiche qqch.
 
<?
$fp = fopen("fichier.txt","r" );    
while(!feof($fp)) // Tant que l'on n'est pas à la fin du fichier on continue de lire le fichier
{
$ligne = fgets($fp, 1024); //lecture ligne par ligne
if (!feof($fp))  
 {
 $pos = strpos($ligne, 'P', 0);  
 if ($pos == "0" )    //si la 1ere lettre est un P
  {
  print "c'est cette ligne qui contient un P:$ligne<br>";
  }
 else
  {
  print "$ligne<br>"; //sinon on affiche la ligne normalement
  }
 }
}
fclose($fp);
?>  
 
voila ce que ca me retourne:
c'est cette ligne qui contient un P:valeur1
c'est cette ligne qui contient un P:Paleur2
c'est cette ligne qui contient un P:valeur3  
 
Alors que j'aimerais qu'elle retourne ceci:
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur2
 
Voila, je pense que mon soucis est qu'il manque un test pour CHAQUE ligne, mais bon je ne vois pas trop lol
Quelqu'un saurait svp ?
d'avance merci !

Reply

Marsh Posté le 01-02-2007 à 21:44:18   

Reply

Marsh Posté le 01-02-2007 à 21:53:06    

Code :
  1. foreach (file('fichier.txt') as $line) {
  2.  if (strpos($line, 'P') !== false) {
  3.    // contient P
  4.  } else {
  5.    // ne contient pas P
  6.  }
  7. }


Message édité par sielfried le 01-02-2007 à 21:53:28

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 01-02-2007 à 22:13:20    

merci de ton aide sielfried, mais j'ai mal du m'exprimer, car je voulais en fait que le strpos détecte le 1er caractère de la chaine. Exemple:
chaine1
chaine2
@haine3
chaine4
...
ici je veux détécter le "@" ,c'est qqch comme ca non ?
--> strpos($chaine_a_analyser, '@', 0);
 
par contre tu dois avoir raison sur la forme du programme, avec le foreach ;)

Reply

Marsh Posté le 01-02-2007 à 22:58:46    

J'avais effectivement mal lu (je lis toujours en diagonale), ceci dit tu devrais pouvoir adapter ça en lisant simplement la doc de strpos... (http://fr.php.net/manual/fr/function.strpos.php)
 
Allez va :
 

Code :
  1. foreach (file('fichier.txt') as $line) {  
  2.  if (strpos($line, 'P') === 0) {    // voire : if ($line[0] == 'P')
  3.    // contient P en première lettre
  4.  } else {    
  5.    // sinon
  6.  }
  7. }


 
(edit: corrigé avec ===)


Message édité par sielfried le 02-02-2007 à 10:26:37

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 02-02-2007 à 10:19:09    

avec strpos et un certain nombre d'autres fonctions, il faut utiliser le triple égale ( === ) au lieux du double. Le double se contente de vérifier si la valeur numérique (si possible de transformer en nombre) ou la valeur de la chaine de caractére sont égaux. En php, "false" (faux en francais) à pour équivalent numérique 0 ce qui fait que si tu testes avec le chiffre 0 il te dira que c'est bon.
Avec le triple égal, php va également vérifier le type de donnée. Et là, le booléen "false" sera différent de 0 vu que le type booléen est différent du type numérique.
 
EDIT : D'ailleur, le probléme est expliqué dans la doc de php ( http://fr2.php.net/manual/fr/function.strpos.php ) et le coup du === y est même indiqué en encadré.


Message édité par omega2 le 02-02-2007 à 10:21:26
Reply

Marsh Posté le 02-02-2007 à 10:26:20    

Exact, j'ai écrit ça vite.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 02-02-2007 à 15:31:43    

merci, euh maintenant il me fait le bon teste, seulement il me le fait 4 fois, surement parce qu'il a 3 lignes a mon fichier (+1 de blanc ?)
Ca donne ça:
 
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3  

Reply

Marsh Posté le 02-02-2007 à 15:45:41    

Fais voir ton fichier texte et le code exact que tu as écris.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 02-02-2007 à 18:29:05    

sielfried a écrit :

Fais voir ton fichier texte et le code exact que tu as écris.


 
C'est bon j'ai enfin qqch qui marche :)
 
Voici le code que tu me demandais précédement:

Code :
  1. <?
  2. $fp = fopen("fichier.txt","r" ); 
  3. while(!feof($fp)) // Tant que l'on n'est pas à la fin du fichier on continue de lire le fichier
  4. {
  5. $line = fgets($fp, 1024);
  6.       foreach (file('fichier.txt') as $line) { 
  7.        if (strpos($line, 'P') === 0) { 
  8.          // contient P en première lettre
  9.  print "c'est cette ligne qui contient un P:$line<br>";
  10.        }
  11.        else {   
  12.          // sinon
  13.  print "$line<br>";
  14.        }
  15.       }
  16. }
  17. fclose($fp);
  18. ?>


 
Et voici celui qui marche:
 

Code :
  1. <?php
  2. $fp = fopen("fichier.txt","r" );
  3. while(!feof($fp)) // Tant que l'on n'est pas à la fin du fichier on continue de lire le fichier
  4. {
  5.     $ligne = fgets($fp, 1024); //lecture ligne par ligne
  6.    
  7.     if(substr($ligne, 0, 1) == 'P')
  8.     {
  9.         echo 'C\'est cette ligne qui contient un P:'.$ligne.'<br>';
  10.     }
  11.     else
  12.     {
  13.         echo $ligne.'<br>';
  14.     }
  15. }
  16. fclose($fp);
  17. ?>


 
Par curiosité,j'aimerais quand meme savoir pourquoi le 1er script ne marche pas lol.
merci a tous !

Reply

Marsh Posté le 02-02-2007 à 18:37:24    

lol... non mais ce que j'avais mis suffisait, y a pas besoin de l'entourer par fopen ou quoi que ce soit... :spamafote:


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 02-02-2007 à 18:37:24   

Reply

Marsh Posté le 02-02-2007 à 19:14:18    

bah je ne sais pas, ca m'affiche le bon truc, mais en 4 fois, comme ceci:
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3  
 
alors que ca devrait etre:
valeur1
c'est cette ligne qui contient un P:Paleur2
valeur3  
 
héhé

Reply

Marsh Posté le 02-02-2007 à 19:19:18    

Tu lis ce que j'écris ? [:pingouino]  
 
Je t'ai écrit le code complet, y a rien d'autre à mettre (juste à remplacer les commentaires par ce dont t'as besoin), si t'arrives pas à faire un simple copier-coller je n'y peux rien...
 
edit: mais si ta méthode marche tant mieux, je ne dis pas que j'ai la solution parfaite... c'est juste nettement plus propre et concis selon moi.


Message édité par sielfried le 02-02-2007 à 19:20:15

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Sujets relatifs:

Leave a Replay

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