[Perl] Remplacer Nieme occurence fichier plat

Résolu/Fermé
Goten - 4 juin 2007 à 11:23
 Goten - 5 juin 2007 à 13:15
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.:)
A voir également:

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);
0
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 567
4 juin 2007 à 12:25
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
4 juin 2007 à 13:06
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
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
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 567
4 juin 2007 à 13:26
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
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 567
4 juin 2007 à 18:49
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

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

Posez votre question
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 567
4 juin 2007 à 18:58
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
Super!
Trop fort en perl lami20j
0