[Perl] Remplacer Nieme occurence fichier plat

Résolu
Goten -  
 Goten -
Bonjour,

Comment remplacer dans un fichier de ce type:
toto|tata|titi||toutou|tonton|
popo|papa|pipi||poupou|ponpon|

Apres la 3ieme occurences de | par une valeur constante disons C?

Merci pour votre aide...Vous aurez compris c'est pour redresser un fichier plat.:)
Configuration: Windows XP
Firefox 2.0

5 réponses

  1. Goten
     
    J'essaie un truc comme ça mais ça change rien :)

    #!/usr/bin/perl
    open(FICH, "data.txt");
    while (<FICH>) {
    if ( (index($_,"|") eq 3) ) {
    $_ =~ s/|/C|/;
    }
    print "$_";
    }
    close(FICH);
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    tu veux changer le 3ème | ou le caracactère après le 3ème | ?!
    je vois que en fait le 3ème | et suis toute suite du 4ème

    donc affiche c'est que tu veux obtenir comme résultat pour pouvoir t'aider

    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Si j'ai bien compris il voudrait à partir de ça :
      toto|tata|titi||toutou|tonton|
      popo|papa|pipi||poupou|ponpon|
      Obtenir ça :
      toto|tata|titi|C|toutou|tonton|
      popo|papa|pipi|C|poupou|ponpon|
      ;-))
      0
    2. Goten
       
      lami20j,pro du Perl :)
      T'as raison, pour être plus clair je veux changer le caractere apres le 3eme |
      donc resultat:

      toto|tata|titi|C|toutou|tonton|
      popo|papa|pipi|C|poupou|ponpon|

      Merci!
      0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    je n'ai pas testé

    En ligne de commande (modification directe avec sauvegarde de fichier original - data.txt original deviendra data.txt.orig)
    perl -pi.orig -e 's/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/' data.txt 
    ou
    perl -pi.orig -e 's/\|\|/|C|/' data.txt
    ou
    perl -pi.orig -e 's/(?<=\|)(?=\|)/C/' data.txt
    Sous forme de script (la modification sera écrite dans un autre fichier)
    #!/usr/bin/perl
    
    open LIRE,"data.txt"
        or die "E/S : $!\n";
    open ECRIRE, ">> date_res.txt"
        or die "E/S : $!\n";
    
    while (<LIRE>){
        s/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/; # je vérifie les 3 premiers |
        print ECRIRE;
    }
    close LIRE; close ECRIRE;
    __END__
    ou
    #!/usr/bin/perl
    
    open LIRE,"data.txt"
        or die "E/S : $!\n";
    open ECRIRE, ">> date_res.txt"
        or die "E/S : $!\n";
    
    while (<LIRE>){
        s/\|\|/|C|/;# j'ai remarqué un seul regroupement 
                    # s'il y a plusieurs on ne risque rien
                    # seulement le 1er rencontré sera modifié
        print ECRIRE;
    }
    close LIRE; close ECRIRE;
    __END__
    ou
    #!/usr/bin/perl
    
    open LIRE,"data.txt"
        or die "E/S : $!\n";
    open ECRIRE, ">> date_res.txt"
        or die "E/S : $!\n";
    
    while (<LIRE>){
        s/(?<=\|)(?=\|)/C/; # pareil comme la version 2 sauf que j'utilise les tests avant/arrière
        print ECRIRE;
    }
    close LIRE; close ECRIRE;
    __END__
    --
    lami20j
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Voilà le test avec la ligne de commande
    $ cat data.txt
    toto|tata|titi||toutou|tonton|
    popo|papa|pipi||poupou|ponpon|
    $ perl -pi.orig -e 's/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/' data.txt
    $ cat data.txt
    toto|tata|titi|C|toutou|tonton|
    popo|papa|pipi|C|poupou|ponpon|
    $ mv data.txt.orig data.txt
    $ perl -pi.orig -e 's/\|\|/|C|/' data.txt
    $ cat data.txt
    toto|tata|titi|C|toutou|tonton|
    popo|papa|pipi|C|poupou|ponpon|
    $ mv data.txt.orig data.txt
    $ perl -pi.orig -e 's/(?<=\|)(?=\|)/C/' data.txt
    $ cat data.txt
    toto|tata|titi|C|toutou|tonton|
    popo|papa|pipi|C|poupou|ponpon|

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    et avec le script

    1.
    lami20j@debian:~/trash$ cat data.txt
    toto|tata|titi||toutou|tonton|
    popo|papa|pipi||poupou|ponpon|
    lami20j@debian:~/trash$ cat ccm.pl
    #!/usr/bin/perl
    
    open LIRE,"data.txt"
        or die "E/S : $!\n";
    open ECRIRE, ">> date_res.txt"
        or die "E/S : $!\n";
    
    while (<LIRE>){
        s/^(.*\|.*\|.*\|)(\|.*)$/$1C$2/; # je vérifie les 3 premiers |
        print ECRIRE;
    }
    close LIRE; close ECRIRE;
    __END__
    lami20j@debian:~/trash$ perl ccm.pl
    lami20j@debian:~/trash$ cat data.txt
    toto|tata|titi||toutou|tonton|
    popo|papa|pipi||poupou|ponpon|
    lami20j@debian:~/trash$ cat date_res.txt
    toto|tata|titi|C|toutou|tonton|
    popo|papa|pipi|C|poupou|ponpon|

    2.
    lami20j@debian:~/trash$ cat data.txt
    toto|tata|titi||toutou|tonton|
    popo|papa|pipi||poupou|ponpon|
    lami20j@debian:~/trash$ cat ccm.pl
    #!/usr/bin/perl
    
    open LIRE,"data.txt"
        or die "E/S : $!\n";
    open ECRIRE, ">> date_res.txt"
        or die "E/S : $!\n";
    
    while (<LIRE>){
       s/\|\|/|C|/;# j'ai remarqué un seul regroupement
                         # s'il y a plusieurs on ne risque rien
                   # seulement le 1er rencontré sera modifié
            print ECRIRE;
    }
    close LIRE; close ECRIRE;
    __END__
    lami20j@debian:~/trash$ perl ccm.pl
    lami20j@debian:~/trash$ cat data.txt
    toto|tata|titi||toutou|tonton|
    popo|papa|pipi||poupou|ponpon|
    lami20j@debian:~/trash$ cat date_res.txt
    toto|tata|titi|C|toutou|tonton|
    popo|papa|pipi|C|poupou|ponpon|
    
    3.
    lami20j@debian:~/trash$ cat data.txt
    toto|tata|titi||toutou|tonton|
    popo|papa|pipi||poupou|ponpon|
    lami20j@debian:~/trash$ cat ccm.pl
    #!/usr/bin/perl
    
    open LIRE,"data.txt"
        or die "E/S : $!\n";
    open ECRIRE, ">> date_res.txt"
        or die "E/S : $!\n";
    
    while (<LIRE>){
        s/(?<=\|)(?=\|)/C/; # pareil comme la version 2
                            #sauf que j'utilise les tests avant/arrière
        print ECRIRE;
    }
    close LIRE; close ECRIRE;
    __END__
    lami20j@debian:~/trash$ perl ccm.pl
    lami20j@debian:~/trash$ cat data.txt
    toto|tata|titi||toutou|tonton|
    popo|papa|pipi||poupou|ponpon|
    lami20j@debian:~/trash$ cat date_res.txt
    toto|tata|titi|C|toutou|tonton|
    popo|papa|pipi|C|poupou|ponpon|
    
    0
    1. Goten
       
      Super!
      Trop fort en perl lami20j
      0