Rechercher : dans
Par :

[Perl] Remplacer Nieme occurence fichier plat

Dernière réponse le 5 jun 2007 à 13:15:05 Goten, le 4 jun 2007 à 11:23:42 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [Perl] Remplacer Nieme occurence fichier plat » dans :
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Télécharger TextCrawler VoirVoulez –vous effectuer un remplacement dans vos milliers fichiers textes ? TestCrawler est votre logiciel. TestCrawler est un logiciel permettant de d’effectuer une recherche et un remplacement dans plusieurs fichiers textes. Il est...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
Perl - Caractéristiques du langage VoirFichier source, et interprétation Le fichier source d'un programme écrit en Perl est un simple fichier texte dont l'extension est par convention .pl. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un fichier texte dans sa...

1

Goten, le 4 jun 2007 à 11:56:57

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);

Répondre à Goten

2

lami20j, le 4 jun 2007 à 12:25:56

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

lami20j

Répondre à lami20j

3

jipicy, le 4 jun 2007 à 13:06:08

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|
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

Goten, le 4 jun 2007 à 13:07:13

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!

Répondre à Goten

5

lami20j, le 4 jun 2007 à 13:26:24

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

Répondre à lami20j

6

lami20j, le 4 jun 2007 à 18:49:48

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|

lami20j

Répondre à lami20j

7

lami20j, le 4 jun 2007 à 18:58:03

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|
lami20j

Répondre à lami20j

8

 Goten, le 5 jun 2007 à 13:15:05

Super!
Trop fort en perl lami20j

Répondre à Goten