Posez votre question Signaler

[Perl] Remplacer Nieme occurence fichier plat [Résolu]

Goten - Dernière réponse le 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.:)
Lire la suite 

[Perl] Remplacer Nieme occurence fichier plat »

8 réponses
Réponse
+0
moins plus
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);
Ajouter un commentaire
Réponse
+0
moins plus
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

jipicy- 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|
;-))
Goten - 4 juin 2007 à 13:07
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!
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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|

Ajouter un commentaire
Réponse
+0
moins plus
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|
Goten - 5 juin 2007 à 13:15
Super!
Trop fort en perl lami20j
Ajouter un commentaire
Ce document intitulé « [Perl] Remplacer Nieme occurence fichier plat » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?