IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[langage] suppression d'une ligne quelconque dans un fichier


Sujet :

Langage Perl

  1. #1
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut [langage] suppression d'une ligne quelconque dans un fichier
    Salut, je tiens à préciser que j'ai fait une recherche avant de poser ma question...
    Je voudrais supprimer une ligne dans laquelle se situe une certaine occurance, cette ligne pouvant être située n'importe où dans le fichier. Est-il possible de le faire sans lire ce que je dois conserver et le réécrire dans le fichier ?
    En gros, est-il possible d'ouvrir le fichier, de trouver la ligne, de la supprimer et de fermer le fichier ?

    Merci d'avance.
    Verre vide je te plains, verre plein, je te vide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Ca ira plus vite en passant par ton éditeur de texte préféré

    Non, le + simple que je vois est de créer un fichier temporaire dans lequel tu rapattries TOUTES les données que tu veux conserver.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 18
    Points : 22
    Points
    22
    Par défaut
    non ce n'est pas possible ( enfin à ma connaissance ) !! il te reste plus qu'à copier toutes les lignes ( sauf une bien sur ) !!!

    même si tu trouves une fonction qui fait ça se sera la même chose mais en cachée ( car même en C on ne peut pas le faire ) !!!

  4. #4
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    C'est ce que je me disais mais des fois qu'il y ait plus optimal...Tant pis !
    Merci.
    Voilà ce que j'ai fait (des fois que ça puisse aider quelqu'un) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #Ouverture du fichier et lecture 
    my $trouve=0;
    		my @res=();
    		if (!(open(FICH,"$fichier))) {
    			print "<center><hr><font color=red>$!</center></font><hr>";
    			exit;
    		} else {
    			my @fic = <FICH>;
    			close(FICH);		
    			my $i=0;	
    #enregistrement dans un tableau du contenu du fichier sauf la ligne dans laquelle se situe mon occurence 		
    			foreach(@fic) {
    				my @tab = split(";",$_);
    				if (@tab[0] eq $nom) {
    					$trouve=1;
    				} else {
    					@res[$i] = $_;
    				}
    				$i++;									
    			}			
     
    			if ($trouve == 0) {
    				print "<center><hr><font color=red>Utilisateur <b>$nom</b> inexistant.</center></font><hr>";
    				exit;
    			} elsif (!(open(FICH,">$fichier"))) {
    					print "<center><hr><font color=red>$!</center></font><hr>";
    					exit;
    			} else {
    #écrasement du fichier et écriture du contenu du tableau
    				my $i=0;
    				foreach(@res) {
    					chomp($_);
    					if ($i==scalar(@res)) {
     
    						print FICH $_;	
    					} else {
    						print FICH $_."\n";
    					}
    					$i++;
    				}					
    				close(FICH);
    			}
    		}			
    	}
    Verre vide je te plains, verre plein, je te vide.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    3 petites remarques :

    - tu charges l'intégralité du fichier dans un tableau, c'est une méthode comme une autre, ok. Le jour où tu auras un fichier à lire de plusieurs dizaines de Mo, ton programme risque de ne pas trop aimer. J'en ai déjà vu planter ...

    - tu vérifies qu'une ligne ne corresponde pas à la chaine que tu ne veux plus, ok. Mais es-tu sûr que la chaîne occupe la totalité d'une ligne ???

    - tu t'es énormément compliqué l'existence

    Voici ma contribution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    use strict;
     
    my $Old_Fic = "mon_ancien_fichier";
    my $New_Fic = "mon_nouveau_fichier";
    my $Flag = 0;
    my $Nom = "la_chaine_que_tu_veux_plus";
     
    open(OLD, "$Old_Fic") or die("Lecture de $Old_Fic impossible : $!");
    open(NEW, ">$New_Fic") or die("Creation de $New_Fic impossible : $!");
     
    while(<OLD>)
    {
        if ($_ =~ /$Nom/i)
        {
            ++$Flag;
        }
        else
        {
            print NEW $_;
        }
    }
    close(OLD);
    close(NEW);
     
    print "Nombre d'occurences de $Nom = $Flag\n";

  6. #6
    Jeh
    Jeh est déconnecté
    Membre actif Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Points : 250
    Points
    250
    Par défaut
    C'est beaucoup moins long, en effet...
    Mais le truc c'est que je voulais garder le même fichier. Et mon fichier ne dépassera pas quelques Ko. Mais je vais quand même changer, ça parait plus sur.

    - tu vérifies qu'une ligne ne corresponde pas à la chaine que tu ne veux plus, ok. Mais es-tu sûr que la chaîne occupe la totalité d'une ligne ???
    => ma chaine n'occupe pas la totalité de la ligne, mais si je la trouve dans une ligne, je supprime la totalité de la ligne et pas seulement la chaine recherchée.
    D'ailleurs, ça me fait penser que mon split n'a pas grand intérêt...
    Merci en tout cas.
    Verre vide je te plains, verre plein, je te vide.

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Ah oui, ok, je n'avais pas vu que tu splittais une ligne en fonction des ";" qu'elle contient. Via expression régulière toute simple comme je l'ai fait, ça va nettement plus vite.

    Quant au fichier d'origine, rien ne t'empêche de le renommer avant de créer le nouveau fichier qui, lui, porte dès le début le bon nom de fichier que tu veux. Ou bien, tu renommes après traitement, ça revient au même.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression d'une ligne particulière dans un fichier texte
    Par Aymeric41 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 29/08/2011, 13h53
  2. extraire une ligne positionnée dans X fichiers
    Par AlexFred dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2008, 17h42
  3. supprimer une ligne spécifié dans un fichier
    Par ouadie99 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 15/03/2008, 15h25
  4. Ecrire à une ligne précise dans un fichier
    Par Valkirion dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2007, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo