OVH Cloud OVH Cloud

Remplacement de mots dans une chaine

12 réponses
Avatar
Timothée POISOT
Bonjour tous

Je suis en train de r=E9aliser un petit script qui me permet de
remplacer les acronymes par la balise <acronym> et le mot complet.

J'ai un fichier texte qui contient l'acronyme et le code html, que je
splite pour remplir deux tableaux, et ensuite je parcours mon fichier
texte a la recherche d'occurences des acronymes.

@mot contient les acronymes, et @remplacement contient le code html

J'utilise le code suivant, pour chaque ligne du fichier (*.txt de
petite taille)

sub parse_ligne
{
my $ligne =3D $_;
for ( my $i =3D 0 ; $i < $dictionnaire_taille-1 ; $i++ )
{
if ($ligne =3D~ m/$mot[$i]/gi)
{
$ligne =3D~ s/$mot[$i]/$remplacement[$i]/gi;
}
}
//print $ligne;
print `echo $ligne >> $path_sortie`;
}

Mon probleme, c'est que
- les accronymes ne sont pas remplac=E9s
- seule la derni=E8re ligne du fichier de d=E9part est dans le fichier de
sortie

Est-ce que quelqu'un peut me donner un petit indice ?

Merci

10 réponses

1 2
Avatar
kurtz le pirate
In article ,
"Timothée POISOT" wrote:

Bonjour tous

Je suis en train de réaliser un petit script qui me permet de
remplacer les acronymes par la balise <acronym> et le mot complet.

J'ai un fichier texte qui contient l'acronyme et le code html, que je
splite pour remplir deux tableaux, et ensuite je parcours mon fichier
texte a la recherche d'occurences des acronymes.

@mot contient les acronymes, et @remplacement contient le code html

J'utilise le code suivant, pour chaque ligne du fichier (*.txt de
petite taille)

sub parse ligne
{
my $ligne = $ ;
for ( my $i = 0 ; $i < $dictionnaire taille-1 ; $i++ )
{
if ($ligne =~ m/$mot[$i]/gi)
{
$ligne =~ s/$mot[$i]/$remplacement[$i]/gi;
}
}
//print $ligne;
print `echo $ligne >> $path sortie`;
}

Mon probleme, c'est que
- les accronymes ne sont pas remplacés
- seule la dernière ligne du fichier de départ est dans le fichier de
sortie

Est-ce que quelqu'un peut me donner un petit indice ?

Merci


avis d'un débutant :
- un hash avec l'acronyme comme clé et la code html comme donnée.
- test avec exists($hash{$key})
- un vrai fichier de sortie avec open(), print et close() plutôt que
"print `echo $ligne >> $path sortie`"


--
klp

Avatar
Timothée POISOT
kurtz le pirate wrote:
In article ,
"Timothée POISOT" wrote:

Bonjour tous

Je suis en train de réaliser un petit script qui me permet de
remplacer les acronymes par la balise <acronym> et le mot complet.

J'ai un fichier texte qui contient l'acronyme et le code html, que je
splite pour remplir deux tableaux, et ensuite je parcours mon fichier
texte a la recherche d'occurences des acronymes.

@mot contient les acronymes, et @remplacement contient le code html

J'utilise le code suivant, pour chaque ligne du fichier (*.txt de
petite taille)

sub parse ligne
{
my $ligne = $ ;
for ( my $i = 0 ; $i < $dictionnaire taille-1 ; $i++ )
{
if ($ligne =~ m/$mot[$i]/gi)
{
$ligne =~ s/$mot[$i]/$remplacement[$i]/gi;
}
}
//print $ligne;
print `echo $ligne >> $path sortie`;
}

Mon probleme, c'est que
- les accronymes ne sont pas remplacés
- seule la dernière ligne du fichier de départ est dans le fichier de
sortie

Est-ce que quelqu'un peut me donner un petit indice ?

Merci


avis d'un débutant :
- un hash avec l'acronyme comme clé et la code html comme donnée.
- test avec exists($hash{$key})
- un vrai fichier de sortie avec open(), print et close() plutôt que
"print `echo $ligne >> $path sortie`"


--
klp


Ca ne répond pas au probleme...


Avatar
Rue des Prairies
Bonjour tous

Je suis en train de réaliser un petit script qui me permet de
remplacer les acronymes par la balise <acronym> et le mot complet.

J'ai un fichier texte qui contient l'acronyme et le code html, que je
splite pour remplir deux tableaux, et ensuite je parcours mon fichier
texte a la recherche d'occurences des acronymes.

@mot contient les acronymes, et @remplacement contient le code html

J'utilise le code suivant, pour chaque ligne du fichier (*.txt de
petite taille)

sub parse_ligne
{
my $ligne = $_;
for ( my $i = 0 ; $i < $dictionnaire_taille-1 ; $i++ )
{
if ($ligne =~ m/$mot[$i]/gi)
{
$ligne =~ s/$mot[$i]/$remplacement[$i]/gi;
}
}
//print $ligne;
print `echo $ligne >> $path_sortie`;
}

Mon probleme, c'est que
- les accronymes ne sont pas remplacés
- seule la dernière ligne du fichier de départ est dans le fichier de
sortie

Est-ce que quelqu'un peut me donner un petit indice ?

Merci



Bonjour,

Je suppose que appelles parse_ligne comme ça : &parse_ligne($ligne)
auquel cas tu récupères $ligne par : my ($ligne) = @_;
D'autre part,
comment est calculée la variable $dictionnaire_taille ?
si c'est la taille du tableau @mot, ta boucle ne traitera pas le dernier
élément, il ne faut pas soustraire 1.
Que fait le // devant print $ligne ? Si c'est pour mettre en
commentaire, il faut mettre #.

Olivier.

Avatar
Timothée POISOT
Je suppose que appelles parse_ligne comme ça : &parse_ligne($ligne)
auquel cas tu récupères $ligne par : my ($ligne) = @_;


$_ fonctionne aussi

D'autre part,
comment est calculée la variable $dictionnaire_taille ?
si c'est la taille du tableau @mot, ta boucle ne traitera pas le dernier
élément, il ne faut pas soustraire 1.


@mot+=1; en fait

Que fait le // devant print $ligne ? Si c'est pour mettre en
commentaire, il faut mettre #.


Erreur de ma part

Et la réponse au VRAI probleme ??

Avatar
Rue des Prairies
Je suppose que appelles parse_ligne comme ça : &parse_ligne($ligne)
auquel cas tu récupères $ligne par : my ($ligne) = @_;


$_ fonctionne aussi


Pas que je sache, ou alors $_[0]


D'autre part,
comment est calculée la variable $dictionnaire_taille ?
si c'est la taille du tableau @mot, ta boucle ne traitera pas le dernier
élément, il ne faut pas soustraire 1.


@mot+=1; en fait

Que fait le // devant print $ligne ? Si c'est pour mettre en
commentaire, il faut mettre #.


Erreur de ma part

Et la réponse au VRAI probleme ??



Si tu récupères bien la ligne à traiter ça fonctionne.


Avatar
Timothée POISOT
Rue des Prairies wrote:
Je suppose que appelles parse_ligne comme ça : &parse_ligne($ligne)
auquel cas tu récupères $ligne par : my ($ligne) = @_;


$_ fonctionne aussi


Pas que je sache, ou alors $_[0]


Si je l'affirme, c'est que je l'ai testé ;-)


D'autre part,
comment est calculée la variable $dictionnaire_taille ?
si c'est la taille du tableau @mot, ta boucle ne traitera pas le derni er
élément, il ne faut pas soustraire 1.


@mot+=1; en fait

Que fait le // devant print $ligne ? Si c'est pour mettre en
commentaire, il faut mettre #.


Erreur de ma part

Et la réponse au VRAI probleme ??



Si tu récupères bien la ligne à traiter ça fonctionne.


Et bien non. Je récupère effectivement la ligne a tester, mais pas
moyen de remplacer...



Avatar
Paul Gaborit
À (at) 6 Jun 2006 02:55:57 -0700,
"Timothée POISOT" écrivait (wrote):
Je suppose que appelles parse_ligne comme ça : &parse_ligne($ligne)
auquel cas tu récupères $ligne par : my ($ligne) = @_;


$_ fonctionne aussi


Ah !?! C'est un effet secondaire d'une partie du code que vous ne nous
montrez pas. Dans le cas général, $_ ne fonctionnera pas.

D'autre part,
comment est calculée la variable $dictionnaire_taille ?
si c'est la taille du tableau @mot, ta boucle ne traitera pas le dernier
élément, il ne faut pas soustraire 1.


@mot+=1; en fait


Cette dernière ligne n'a pas de sens en Perl... Donc la question reste
entière : que vaut cette fameuse variable $dictionnaire_taille ?

Que fait le // devant print $ligne ? Si c'est pour mettre en
commentaire, il faut mettre #.


Erreur de ma part


Montrez-nous donc du code réel plutôt qu'un pseudo code plus ou moins
bien recopié...

Et la réponse au VRAI probleme ??


Elle est peut-être cachée dans le code que vous ne nous montrez pas...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Rue des Prairies
Rue des Prairies wrote:
Je suppose que appelles parse_ligne comme ça : &parse_ligne($ligne)
auquel cas tu récupères $ligne par : my ($ligne) = @_;
$_ fonctionne aussi

Pas que je sache, ou alors $_[0]



Si je l'affirme, c'est que je l'ai testé ;-)


Non, tu récupères la valeur $_, qui vaut ce qu'elle vaut, mais pas la
valeur passée en paramètre.


D'autre part,
comment est calculée la variable $dictionnaire_taille ?
si c'est la taille du tableau @mot, ta boucle ne traitera pas le dernier
élément, il ne faut pas soustraire 1.
@mot+=1; en fait


Que fait le // devant print $ligne ? Si c'est pour mettre en
commentaire, il faut mettre #.
Erreur de ma part


Et la réponse au VRAI probleme ??

Si tu récupères bien la ligne à traiter ça fonctionne.



Et bien non. Je récupère effectivement la ligne a tester, mais pas
moyen de remplacer...



Montre un peu plus le reste de ton code avec des exemples de lignes où
effectuer la substitution.
Comment ouvres-tu ton fichier de sortie ?




Avatar
Timothée POISOT
Paul Gaborit wrote:
À (at) 6 Jun 2006 02:55:57 -0700,
"Timothée POISOT" écrivait (wrote):
Je suppose que appelles parse_ligne comme ça : &parse_ligne($ligne)
auquel cas tu récupères $ligne par : my ($ligne) = @_;


$_ fonctionne aussi


Ah !?! C'est un effet secondaire d'une partie du code que vous ne nous
montrez pas. Dans le cas général, $_ ne fonctionnera pas.

D'autre part,
comment est calculée la variable $dictionnaire_taille ?
si c'est la taille du tableau @mot, ta boucle ne traitera pas le derni er
élément, il ne faut pas soustraire 1.


@mot+=1; en fait


Cette dernière ligne n'a pas de sens en Perl... Donc la question reste
entière : que vaut cette fameuse variable $dictionnaire_taille ?

Que fait le // devant print $ligne ? Si c'est pour mettre en
commentaire, il faut mettre #.


Erreur de ma part


Montrez-nous donc du code réel plutôt qu'un pseudo code plus ou moins
bien recopié...

Et la réponse au VRAI probleme ??


Elle est peut-être cachée dans le code que vous ne nous montrez pas...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


#!C:perlbienperl.exe -w
use strict;
use Warnings;

my @dictionnaire;
my $dictionnaire_taille;
my (@mot, @remplacement);
my @fichier_entree;
my @fichier_sortie;
my $path_entree;
my $path_sortie;

&head;
$dictionnaire_taille = @dictionnaire;

sub head
{
print "Lecture du dictionnairen";
open (DIC, "+<dictionnaire.txt") or die "nLe fichier dictionnaire.txt
doit etre present ($!) !";
my @dictionnaire = <DIC>;
close (DIC);
foreach ( @dictionnaire )
{
my ($mot, $remplacement);
($mot, $remplacement) = split(/¤/, $_);
unshift(@mot, $mot);
unshift(@remplacement, $remplacement);
print "$mottt$remplacementnn";
}
}

&entree_fichier;

sub entree_fichier
{
print "nEntrez le nom du fichier a convertir:n";
print "t>>";
$path_entree = <STDIN>;
chomp($path_entree);
$path_sortie = $path_entree.'.LOMoutput';
open (ENTR, "+<".$path_entree);
my @fichier_entree = <ENTR>;
close (ENTR);
foreach (@fichier_entree)
{
&parse_ligne($_);
}
}

sub parse_ligne
{
my $ligne = $_[0];
chomp($ligne);
for ( my $i = 1 ; $i < $dictionnaire_taille ; $i++ )
{
if ($ligne =~ m|@mot[$i]|gi)
{
$ligne =~ s/$mot[$i]/$remplacement[$i]/gei;
}
}
print `echo $ligne >> $path_sortie`;
}

exemple de ligne du dictionnaire :

BLAST¤<acronym title="Basic Local Alignment Search
Tool">BLAST</acronym>



Avatar
Paul Gaborit
Les bugs sont biens là... Je corrige les principaux au fur et à mesure
mais il y aurait beaucoup à redire.

À (at) 6 Jun 2006 04:53:09 -0700,
"Timothée POISOT" écrivait (wrote):
#!C:perlbienperl.exe -w
use strict;
use Warnings;


use warnings; # pas de majuscule !

my @dictionnaire;
my $dictionnaire_taille;
my (@mot, @remplacement);
my @fichier_entree;
my @fichier_sortie;
my $path_entree;
my $path_sortie;


# déclarer les variables là où elles sont nécessaires...

&head;


head();
# la notation &head n'a pas le sens que vous croyez...
# Il vaut mieux appeler une fonction par son nom et une liste de
# paramètres (éventuellement vide) et sans & devant !

$dictionnaire_taille = @dictionnaire;


$dictionnaire_taille = @mot;
# @dictionnaire ne devrait exister que dans 'head'

sub head
{
print "Lecture du dictionnairen";
open (DIC, "+<dictionnaire.txt") or die "nLe fichier dictionnaire.txt
doit etre present ($!) !";


open (DIC, "<", "dictionnaire.txt")
or die "Le fichier 'dictionnaire.txt' doit etre present : $!";

# le mode "+<" ne vous sert strictement à rien ici

my @dictionnaire = <DIC>;
close (DIC);
foreach ( @dictionnaire )
{
my ($mot, $remplacement);
($mot, $remplacement) = split(/¤/, $_);
unshift(@mot, $mot);
unshift(@remplacement, $remplacement);
print "$mottt$remplacementnn";
}
}

&entree_fichier;

sub entree_fichier
{
print "nEntrez le nom du fichier a convertir:n";
print "t>>";
$path_entree = <STDIN>;
chomp($path_entree);
$path_sortie = $path_entree.'.LOMoutput';
open (ENTR, "+<".$path_entree);
my @fichier_entree = <ENTR>;
close (ENTR);
foreach (@fichier_entree)
{
&parse_ligne($_);
}
}

sub parse_ligne
{
my $ligne = $_[0];
chomp($ligne);
for ( my $i = 1 ; $i < $dictionnaire_taille ; $i++ )


for ( my $i = 0 ; $i < $dictionnaire_taille ; $i++ )

# les indices commencent à zéro
{
if ($ligne =~ m|@mot[$i]|gi)


if ($ligne =~ m|$mot[$i]|gi)

# $mot[$i] n'a pas le même sens que @mot[$i]
# Il est inutile de préfixer les crochets puisque l'interpolation des
# variables a lieu avant l'interprétation de la regexp par le moteur
# de rexgexp.

{
$ligne =~ s/$mot[$i]/$remplacement[$i]/gei;
}
}
print `echo $ligne >> $path_sortie`;


print "$lignen"; # ne passe pas par un appel à un shell externe

# pour pouvoir écrire dans un fichier, il faudrait l'ouvrir en
# écriture au préalable.

}




--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

1 2