Effacer une ligne d'un fichier sans lire tout le fichier ...

Soyez le premier à donner votre avis sur cette source.

Vue 10 731 fois - Téléchargée 224 fois

Description

BUT : J'ai une base de donnée de plusieurs 10 aine de mégaoctets stockée dans un fichier texte. Je veux éffacer un enregistrement dedans, je regarde sur le net, mais la seul solution que je trouve , c'est de lire le fichier et de le réécrire avec une ligne en moin , celle qu'on voulait éffacer. Vu la taille de mon fichier ce n'est pas viable . Je crée donc une fonction qui 'méfface une ou plusieurs lignes d'un fichier sans pour autant lire le fichier complet (au passage je récupérere la valeur des lignes )

Source / Exemple :


define("ERREUR",-1);

function LirePuisEffacer($CheminFichier,$TamponSQL){
 if($fp=fopen($CheminFichier,'r+')){
           $requetes = "";
           $lines    = array();
           $i=0;
           // on lit  $TamponSQL requetes
            Do {
                    // récupérere les enregistrements
                    $requete= fgets($fp, 4096);
                    $taille =strlen($requete);

                    // on vérifie que la ligne lu ne vaut pas espace

                   if (ltrim($requete)<>"")
                   {
                      $i++;
                      $lines[] = $requete;
                   }
                      $fin=feof($fp);
                    // génére un tampon contenant 'taille' espaces
                     $tampon="";
                     for ($j = 0; $j < ($taille); $j++) {
                         $tampon .=" ";
                         // il serai mieux de mettre un Backspace, mais je ne connais pas
                         // l'équivalent PHP et chr(8) ne convient pas
                         }

                      // positionne le curseur en début de ligne
                      fseek($fp,-$taille,SEEK_CUR);

                      if ( $i<>$TamponSQL){
                          // remplace la ligne en cours par des espaces (saut de ligne inclus)
                          fputs($fp,$tampon,$taille);
                     } else {
                          // remplace la ligne en cours par des espaces mais garde le retour à la ligne
                          fputs($fp,$tampon,($taille-2));
                          fputs($fp,"\r\n");
                     }

                         // faire gaffe au cas ou c vide

                } while ( $i<$TamponSQL and $fin<>1);
          fclose($fp);
          if ($fin == 1) $lines =ERREUR;
          } else {$lines=ERREUR;}
          return $lines;
 }

Conclusion :


BUG : Les enregistrements ne sont pas réellement éffacé du fichier mais seulement remplacer par des espaces, ce qui fait que tout éffacement de 1 ou plusieurs enregistrement laissera UNE ligne d'espace,
BUG corrrigé : les fichiers vides n'était pas gérer , maintenant c'est bon

TODO list : remplacer les espaces par des backspaces, cependant le probléme, c'esut que CHR(8) qui code pour les backspace ne marche pas dans ce cas la.
Si vous avez une idée.

http://geiienforce.free.fr

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

bprod
Messages postés
12
Date d'inscription
mercredi 8 octobre 2003
Statut
Membre
Dernière intervention
19 septembre 2005
-
pour moi la methode la plus simple est d'ouvrir le fichier puis grace a file() (qui lit et classe dans un tableau chaque ligne) on peut recreer le fichier sans la ligne que tu veux supprimer (grace a son indice)..en esperant avoit été clair!
Je mettrais mes sources en ligne qd le site sera fini (juillet/aout!)
Mumuri
Messages postés
321
Date d'inscription
mercredi 9 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2008
-
si c'est un fichier de plusieurs méga tu vas t'amuser :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.