[Perl] Remplacer Nieme occurence fichier plat

[Résolu/Fermé]
Signaler
-
 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.:)

5 réponses

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);
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
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|
;-))
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!
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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|

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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|
Super!
Trop fort en perl lami20j