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] Susbstitution dans un fichier


Sujet :

Langage Perl

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut [langage] Susbstitution dans un fichier
    Bonjour à vous tous !

    Comme j'ai un peu de temps libre au taf', je m'initie au Perl (après du Java, du PHP et du C, ça ait du bien de découvrir autre chose ).
    Ce que je veux, c'est écrire un petit script qui cherche un motif dans un fichier et le remplac par un autre motif :
    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
     
    #!/usr/bin/perl
     
    print ("Chemin absolu du fichier : \n");
    $f = <STDIN>;
    chomp ($f);
    print ("Rentrer un motif à remplacer : \n");
    $m1 = <STDIN>;
    chomp ($m1);
    print ("Rentrer le motif de remplacement : \n");
    $m2 = <STDIN>;
    chomp ($m2);
    open (FIC, '+<'.$f) || die("Ouverture de $f impossible !");
    $i = 1;
    while (<FIC>) {
    	if (/$m1/) {
    		print ("Motif $m1 trouvé à la ligne $i.\n");
    		$ligne =~ s/$m1/$m2/g;
    		$l = syswrite(FIC, $ligne, length($ligne));
    		print ("Remplacement de $m1 par $m2.\n");
     
    	}
    	$i++;
    }
    close FIC;
    Le script détecte bien les motifs. Le problème, c'est que j'arrive pas à faire les substitutions !
    Où est mon erreur ?

    Merci de vos posts !

    @ +++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bon, g trouvé !

    Pour ceux que ça intéresse :
    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
     
    #!/usr/bin/perl
     
    print ("Chemin absolu du fichier : \n");
    $f = <STDIN>;
    chomp ($f);
    print ("Rentrer un motif à remplacer : \n");
    $m1 = <STDIN>;
    chomp ($m1);
    print ("Rentrer le motif de remplacement : \n");
    $m2 = <STDIN>;
    open (FIC, '+<'.$f) || die("Ouverture de $f impossible !");
    open (FILE, '>toto2.txt') || die("Ouverture de toto2.txt impossible !");
    $i = 1;
    while (<FIC>) {
    	if (/$m1/) {
    		print ("Motif $m1 trouvé à la ligne $i.\n");
    		$_ =~ s/$_/$m2/g;
    		$m = $m2;
    		$l = syswrite(FILE, $_."\n", length($_));
    		print ("Remplacement de $m1 par ".chomp($m)."\n");
     
    	}
    	else {
    		$l = syswrite(FILE, $_, length($_));
    	}
    	$i++;
    }
    close FIC;
    close FILE;
    unlink $f;
    rename ("toto2.txt", $f);
    print ("Finished !!!\n");
    @ +++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    On va te faire une version plus Perl. Ce n'est pas parce que Perl a la reputation d'etre un langage de goret qu'il faut oublier l'option -w et use strict :
    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
     
    #!/usr/bin/perl -w
     
    use strict;
    $| = 1; # Pour vider les buffer
     
    my ($f, $m1, $m2);
    print "Chemin absolu du fichier : " and chomp($f = <STDIN>);
    print "Rentrer un motif a remplacer : " and chomp($m1 = <STDIN>);
    print "Rentrer le motif de remplacement : " and chomp($m2 = <STDIN>);
    open FIC, $f or die "$f : $!\n";
    open FILE, '>toto2.txt' or die "toto2.txt : $!\n";
    my $i = 1;
    while (<FIC>) {
       if (/$m1/) {
          print "Motif $m1 trouve a la ligne $i.\n";
          s/$m1/$m2/g;
          print FILE ;
          print "Remplacement de $m1 par $m2\n";
       }
       else {
          print FILE ;
       }
       $i++;
    }
    close FIC and close FILE;
    unlink $f;
    rename "toto2.txt", $f;
    print "Finished !!!\n";
    C'est une possibilité.

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Merci Nyal pour ce complément, j'étudierais ça histoire d'en apprendre plus sur ce langage de script qu'est Perl.

    Merci encore et @ +++
    Bon WE
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Membre habitué
    Inscrit en
    Août 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 156
    Points : 187
    Points
    187
    Par défaut
    les améliorations de nyal étaient indispensables

    on peut aussi lire le fichier d'un coup et remplacer toutes les occurences en une fois en mémoire (dépend de la taille du fichier) (mais dans ce cas on ne récupère pas les numéros de lignes )
    -- plus les choses changent...
    plus elles restent les mêmes
    --snake plissken
    pb résolus +20

  6. #6
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Citation Envoyé par darkloran
    les améliorations de nyal étaient indispensables
    Ce ne sont pas des ameliorations mais des changements pour rester dans l'esprit Perl.
    C'est tout a fait different (bon suis de mauvaise foie )
    Puis l'utilisation de syswrite n'etait pas judicieuse. (Ca ressemble trop au C)

  7. #7
    Membre habitué
    Inscrit en
    Août 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 156
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par nyal
    Ce ne sont pas des ameliorations mais des changements pour rester dans l'esprit Perl.
    j'accepte cette correction... "there's more than one way to do it..."
    ceci dit, il y a des manières qu'il vaut mieux éviter
    -- plus les choses changent...
    plus elles restent les mêmes
    --snake plissken
    pb résolus +20

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

Discussions similaires

  1. utiliser le langage C dans des fichiers cpp
    Par ikuzar dans le forum Débuter
    Réponses: 5
    Dernier message: 03/02/2011, 18h24
  2. [langage] tabulation dans un fichier txt
    Par TigreRouge dans le forum Langage
    Réponses: 2
    Dernier message: 16/08/2004, 17h36
  3. Réponses: 2
    Dernier message: 11/03/2004, 15h20
  4. Réponses: 6
    Dernier message: 04/03/2004, 09h35
  5. [langage] Créé un hash dans un fichier...
    Par Smooky dans le forum Langage
    Réponses: 3
    Dernier message: 26/03/2003, 08h49

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