Manipulation de fichier

Manipulation de fichier - PHP - Programmation

Marsh Posté le 06-02-2007 à 15:33:54    

Bonjour;
Je voudrais savoir comment faire pour parcourir un fichier.txt pour trouver une donnée puis la supprimer.  
Voici ce que j'ai fait mais cela ne fonctionne pas.

Code :
  1. if(    isset($_POST['effacer']) && isset($_POST['nom']) )
  2. {
  3.     if(file_exists("clients.txt" ))
  4.     {
  5.     $ouvre=fopen("clients.txt","r" );
  6.     while (!feof ($ouvre))         
  7.         {
  8.         $lecture = fgets($ouvre, 400);
  9.         $donnee=explode(";",$lecture); 
  10.         $combien=count($donnee)-1;
  11.         for ($i=0;$i<$combien;$i++)
  12.             {
  13.             if (ereg($_POST['nom'],$donnee[$i])){$donnee[$i]=$donnee[$i]="";}
  14.             if ($donnee[$i]!="" ){$liste_modif.=$donnee[$i].";";}
  15.             }
  16.     }
  17.     fclose($ouvre);
  18.     $ouvre=fopen("clients.txt","w+" );
  19.     fwrite($ouvre,$liste_modif);
  20.     fclose($ouvre);
  21.     echo "<h2>Client ",$_POST['nom'],"  effacé </h2> ";
  22. }
  23. }


Si qq1 a des informations, elles sont les bienvenues.
Merci.

Reply

Marsh Posté le 06-02-2007 à 15:33:54   

Reply

Marsh Posté le 06-02-2007 à 15:50:44    

Ton fichier est sous quelle forme?
Ce genre là :

Dupont;Jean;AutreInfos
Durand;Patrice;EncoreLautreInfo
Cury;Pierre-poulet;marie

 

Si oui, moi je ferais un file_get_contents() pour récupérer simplement tout le contenu du fichier, puis un double explode sur \n et ;.

Code :
  1. <?
  2. $content = file_get_content('clients.txt');
  3. $list = explode(';',explode('\n',$content));
  4. ?>
 

Il est ensuite très simple de chercher le nom de celui que l'on veut supprimer dans le tableau ainsi obtennu.
Enfin pour réécrire le tableaux, imploder le tout!


Message édité par dwogsi le 06-02-2007 à 15:56:07

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-02-2007 à 15:53:51    

Reply

Marsh Posté le 06-02-2007 à 15:56:39    

Oui tiens je les oublie toujours celles-là.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 06-02-2007 à 17:13:34    

[quotemsg=1511432,2,219001]Ton fichier est sous quelle forme?
Ce genre là :

Dupont;Jean;AutreInfos
Durand;Patrice;EncoreLautreInfo
Cury;Pierre-poulet;marie


 
Oui, le fichier est sous cette forme.

Reply

Marsh Posté le 06-02-2007 à 18:13:15    

Ok, bon alors ma méthode peut fonctionner. mais ce n'est pas forcément la meilleur et elle peut poser des problèmes de mémoire si le fichier est très volumineux.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 07-02-2007 à 14:39:37    

Mon problème persiste encore:
voici en détail ce qui se passe
 
Le fichier se présente dans la forme initiale suivante:
aaaa;bbbb;cccc;dddd
xxxx;zzda;azdaz;azrffzefzef
szddqdq;dd;zd;zdazd
 
Ce que je veux, c'est quand je $_POST la première valeur d'une ligne par exemple xxxx de la ligne xxxx;zzda;azdaz;azrffzefzef  toute la ligne disparaisse.
 
Ce qui donnerait:  
aaaa;bbbb;cccc;dddd
szddqdq;dd;zd;zdazd
 
Hors avec mon code actuel  

Code :
  1. if (    isset($_POST['effacer']) && isset($_POST['nom1']) )
  2. {
  3.     if(file_exists("clients.txt" ))
  4.     {
  5.     $id_file=fopen("clients.txt","r" );
  6.     flock($id_file,1);
  7.     $liste_modif="";
  8.         while (!feof ($id_file)) // Parcourir le fichier tant qu'il n'est pas fini
  9.         {
  10.         $lecture = fgets($id_file, 4096);
  11.         $donnee=explode(";",$lecture); 
  12.         $combien=count($donnee);
  13.         for ($i=0;$i<$combien;$i++)
  14.             {
  15.             if (ereg($_POST['nom1'],$donnee[$i])){$donnee[$i]="";}
  16.             if ($donnee[$i]!="" ){$liste_modif.=$donnee[$i].";";} // Cas de donnée nulle
  17.             }
  18.         }
  19.         flock($id_file,3);
  20.         fclose($id_file);
  21.         $id_file=fopen("clients.txt","w+" );
  22.         fwrite($id_file,$liste_modif);
  23.         fclose($id_file);
  24.         echo "<h2>Client ",$_POST['nom1'],"  effacé </h2> ";
  25.     }
  26.     else {echo "fichier inaccessible";}
  27. }


 
j'ai pour résultat:
aaaa;bbbb;cccc;dddd
;zzda;azdaz;azrffzefzef
;szddqdq;dd;zd;zdazd;
 
Soit la suppression de xxxx uniquement et non pas toute la ligne, par ailleurs il y a un ";" qui s'insère dans la ligne suivante.
 
Comment faire pour obtenir le résultat (lorsque je demande de supprimer la ligne dont le premier élement est xxxx):  
aaaa;bbbb;cccc;dddd
szddqdq;dd;zd;zdazd
 
Je continue de faire de nouvelles combinaisons, pour le moment cela ne fonctionne pas.
 
Merci.


Message édité par teycir le 07-02-2007 à 14:43:14
Reply

Marsh Posté le 07-02-2007 à 14:54:48    

pourquoi tester tous les éléments d'une ligne alors que c'est le premier élément qui t'interesse ?
il y a plus simple : si la ligne commence par "xxxx;" alors tu supprimes, donc pas besoin de explode, ereg ...etc

Reply

Marsh Posté le 07-02-2007 à 15:08:30    

Salut,
j'ai un peut simplifié
 
if (isset($_GET['effacer']) && isset($_GET['nom1']))
{
  if(file_exists("clients.txt" )) {
    $file = file("clients.txt" ); // conserve les sauts a la ligne
    foreach($file as $line) {
      if(substr($line, 0, strlen($nom1)) != $nom1) {
        $new .= $line; //on ne garde que les lignes qui ne commencent pas par $nom1
      } else echo "<h2>Client ",$_GET['nom1'],"  effacé </h2> ";
    }
    fwrite(fopen("clients.txt","w+" ), $new);
  }
  else {echo "fichier inaccessible";}
}
 
tu peux remplacer le strlen($nom1) par une recherche de la position du 1er ";"

Reply

Marsh Posté le 07-02-2007 à 15:31:36    

tu vas effacer toutes les lignes qui commencent par "xxxx",
à mon avis il ne faut effacer que les lignes qui commencent par "xxxx;"

Reply

Marsh Posté le 07-02-2007 à 15:31:36   

Reply

Marsh Posté le 07-02-2007 à 15:57:23    

ben
 
if(substr($line, 0, strlen($nom1)+1) != $nom1 . ";" )
 
ou comme je disais avec la recherche du 1er ";" selon les gouts ^^
 
if(substr($line, 0, strpos($line, ";" )) != $nom1)

Message cité 1 fois
Message édité par hardcoregamer le 07-02-2007 à 16:40:15
Reply

Marsh Posté le 09-02-2007 à 15:24:48    

hardcoregamer a écrit :

ben

 

if(substr($line, 0, strlen($nom1)+1) != $nom1 . ";" )

 

ou comme je disais avec la recherche du 1er ";" selon les gouts ^^

 

if(substr($line, 0, strpos($line, ";" )) != $nom1)

 

Salut;
voici une solution qui a finalement marché:

Code :
  1. if (isset($_POST['effacer']) && isset($_POST['nom1']))
  2. {
  3. if(file_exists('clients.txt'))
  4. {
  5.  $client_trouve = FALSE;
  6.  $id_file = fopen('clients.txt', 'r');
  7.  flock($id_file, LOCK_SH); // Pose d'un verrou en lecture
  8.  $liste_modif = '';
  9.  while (!feof($id_file)) // Parcourir le fichier tant qu'il n'est pas fini
  10.  {
  11.   $lecture = fgets($id_file, 4096);
  12.   if (preg_match('#^' . preg_quote($_POST['nom1']) . ';#', $lecture))
  13.   {$client_trouve = TRUE;}
  14.   else {$liste_modif .= $lecture;}
  15.  }
  16.  flock($id_file, LOCK_UN); // Libération du verrou
  17.  fclose($id_file);
  18.  $id_file = fopen('clients.txt', 'w+');
  19.  flock($id_file, LOCK_EX); // Pose d'un verrou en écriture
  20.  fwrite($id_file, $liste_modif);
  21.  flock($id_file, LOCK_UN); // Libération du verrou
  22.  fclose($id_file);
  23.  if ($client_trouve)
  24.  {echo '<h2>Client ' . $_POST['nom1'] . '  effacé </h2> ';}
  25.  else {echo '<h2>Aucun client du nom de ' . $_POST['nom1'] . '</h2>';}
  26. }
  27. else {echo "Fichier inaccessible";}
  28. }


Message édité par teycir le 09-02-2007 à 15:26:27
Reply

Sujets relatifs:

Leave a Replay

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