rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[Perl] Remplacer Nieme occurence fichier plat

Goten, le lundi 4 juin 2007 à 11:23:42
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
Répondre à Goten  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Goten, le lundi 4 juin 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le lundi 4 juin 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le lundi 4 juin 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Goten, le lundi 4 juin 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le lundi 4 juin 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le lundi 4 juin 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le lundi 4 juin 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 Goten, le mardi 5 juin 2007 à 13:15:05
Super!
Trop fort en perl lami20j
Répondre à Goten
Logiciels pertinents trouvés dans les téléchargements
Télécharger ActivePerl 5.6.1.629ActivePerl - ActivePerl est un interpréteur Perl gratuit et puissant pour plates formes Microsoft Windows. Il nécessite "Microsoft...Catégorie: Perl
Licence: Open Source
Télécharger PSPad 4.5.2PSPad - PSPad est un excellent éditeur de texte. Il est utile pour travailler sur du simple texte, mais aussi sur du HTML, CSS,...Catégorie: Développement
Licence: Freeware/gratuit
Télécharger AVISplit Classic 1.43AVISplit Classic - AVISplit permet de découper et d'assembler des morceaux d'une vidéo au format AVI dans l'ordre souhaité, comme tout bon...Catégorie: Edition vidéo
Licence: Freeware/gratuit
Télécharger Crimson Editor 3.70Crimson Editor - Crimson Editor est un éditeur professionnel de code source pour Windows. Ce programme, très léger en terme de taille,...Catégorie: Webmaster
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « [Perl] Remplacer Nieme occurence fichier plat »