Remplacer un mot dans un fichier

Remplacer un mot dans un fichier - Perl - Programmation

Marsh Posté le 13-04-2013 à 17:00:31    

je veux faire un script qui permet de :  
Remplacer une suite des mots séparés par un espace mot qui se trouve dans fich1 ( par exemple ma voiture ) par la mme suite des mots mais séparé par - dans mon fichier fich 2 si cette suite des mots existe ds fich2 ...
 
Exemple : fich 1 contient :  
ma voiture  
mon père  
ma maman  
 
et fich 2 contient les phrases suivantes :  
 
je veux voir mon père
je veux vendre ma voiture  
ma maman est belle  
 
======> le resultat sera donc :  
 
je veux voir mon-père
je veux vendre ma-voiture  
ma-maman est belle
 
je suis débutante en perl , j'ai essayé beaucoup des codes mais rien ne marche

Reply

Marsh Posté le 13-04-2013 à 17:00:31   

Reply

Marsh Posté le 13-04-2013 à 18:06:05    

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my ($fname1, $fname2) = ('fich1.txt', 'fich2.txt');
  7.  
  8. open(my $fh, $fname1);
  9. my @biwords;
  10. foreach (<$fh> ) {
  11.  chomp;
  12.  s/^\s+|\s+$//g;
  13.  push @biwords, $_;
  14. }
  15. close $fh;
  16.  
  17. open($fh, $fname2);
  18. foreach (<$fh> ) {
  19.  foreach my $r (@biwords) {
  20.    my $t = $r =~ s/ /-/r;
  21.    if (/$r/) {
  22.      s/$r/$t/g;
  23.      print;
  24.    }
  25.  }
  26. }
  27. close $fh;


On lit le premier fichier et on met chaque ligne nettoyée des blancs de début et fin dans une liste
On lit le second fichier, pour chaque ligne, si on y trouve un élément de la liste, on fait le remplacement par ce qu'il faut.
 
A+,


Message édité par gilou le 13-04-2013 à 18:06:17

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 18:29:03    

Merci beaucoup pour votre réponse , j'ai essayé de tester le code mais il y a une erreur :
Bareword found where operator expected at E:\Mastère_2013\MesScripts\Concat.pl l
ine 27, near "s/ /-/r"
syntax error at E:\Mastère_2013\MesScripts\Concat.pl line 27, near "s/ /-/r"

Reply

Marsh Posté le 13-04-2013 à 18:47:20    

Chez moi, ça marche [:mr marron derriere]  
Donc soit vous avez fait une faute de frappe, soit vous n'avez pas une version à jour de perl.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 18:51:01    

peut etre a cause de la version en fait commet puis je mettre a jour ma version , ( chui sur windows )

Reply

Marsh Posté le 13-04-2013 à 18:54:19    

Il suffit d'aller le chercher ici: http://www.activestate.com/activeperl/downloads
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 18:54:52    

j'ai la version 5.6.1 , le module autodie n'est pas connu comment faire ?

Reply

Marsh Posté le 13-04-2013 à 18:56:32    

J'ai fait et j'ai telecharger la version 5.16.3 mais le problème est que le fichier a installer .msi n'est pas reconnu par mon PC

Reply

Marsh Posté le 13-04-2013 à 19:04:32    

SVP j'attend votre aide

Reply

Marsh Posté le 13-04-2013 à 19:33:21    

?? Vous utilisez windows? l'extension.msi c'est celle des programmes utilisant l'installeur de microsoft, Microsoft Installer, donc c'est normalement reconnu en standard (a moins que vous soyez sur un système plus ancien que windows XP)
Vous étiez bien sur un compte avec les droits d'administration suffisants pour installer le programme?
A+,


Message édité par gilou le 13-04-2013 à 19:37:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 19:33:21   

Reply

Marsh Posté le 13-04-2013 à 19:35:09    

nn , je suis sur windows 7 , et j'ai pas encore arriver à installer la version 5.16.3 je sais pas quoi faire  :pt1cable:

Reply

Marsh Posté le 13-04-2013 à 19:38:15    

Windows 7, OK, mais êtes vous loggé avec un un compte avec les droits d'administration suffisants pour installer un programme?
Parce que le pb peut venir de la.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 19:39:37    

oui avec compte administrateur

Reply

Marsh Posté le 13-04-2013 à 19:41:34    

Ca devrait être sans pb alors. La je ne peux pas vous en dire plus, j'ai déjà installé une nouvelle version sur des machines avec Windows 7, et je n'ai eu aucun pb avec le fichier msi.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 20:03:37    

Vous pouvez essayer ceci:
Sur cette page http://www.sevenforums.com/tutoria [...] store.html
cliquez sur le lien msi pour récupérer le fichier Default_MSI.reg et suivez la procédure indiquée en tête de page (cliquez sur Default_MSI.reg et choisissez fusionner...)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 20:26:12    

Merci Gilou pour votre aide , en fait si vous me permettez je veux savoir comment fonctionne le code que tu m'a envoyé :  
 
 
foreach (<$fh> )  ==>  <$fh> signifi quoi ??
 
my $t = $r =~ s/ /-/r; ==> le r c quoi ??  
 
 
  if (/$r/) {
      s/$r/$t/g;
      print;
    }   ===> pour dire quoi ?
 
et finalement print quoi exactement  
Merci d'avance

Reply

Marsh Posté le 13-04-2013 à 21:20:55    

Citation :

foreach (<$fh> )  ==>  <$fh> signifi quoi ??


l'opérateur <> évalue le fichier associé au handle $fh et renvoie
- la ligne courante dans un contexte scalaire
- un tableau des lignes dans un contexte de liste
 

Citation :

my $t = $r =~ s/ /-/r; ==> le r c quoi ??  


s///r c'est une opération de substitution non-destructive: la ligne substituée est renvoyée (dans $t ici) , au lieu qu'on aie la substitution en place dans la ligne examinée ($r ici).
 

Citation :

if (/$r/) {  
      s/$r/$t/g;  
      print;  
    }   ===> pour dire quoi ?  
et finalement print quoi exactement  

Je met les deux questions ensemble, car elles sont liées:  
Quand je fais foreach (<$fh> ) la ligne lue est assignée à la variable locale implicite (et faite pour ça) $_  (sinon je ferais foreach my $line  (<$fh> ),  ou on assigne une variable explicite, $line)
Quand on fait le test if (/$r/), c'est sur la variable implicite $_ que porte le test (pour une variable explicite, on ferait if ($line =~ /$r/) )
Donc  if (/$r/) teste si la ligne lue, $_ contient le pattern $r
si oui,  s/$r/$t/g; remplace toutes (le /g)  les occurences de $r par $t (qui est déduit de $r par substitution des blancs par des tirets). Idem, cette substitution s'applique a $_ (sinon on ferait $ligne =~ s/$r/$t/g;), bref, elle s'applique à la ligne lue
et print;, sans rien de plus, s'applique à $_  (sinon on ferait print $ligne;)
 
Tiens, je vois que d'ailleurs j'ai écrit mon code sans bien me relire (j'ai la crève et suis fiévreux)
Ce devrait être

Code :
  1. open($fh, $fname2);
  2. foreach (<$fh> ) {
  3.  foreach my $r (@biwords) {
  4.    my $t = $r =~ s/ /-/r;
  5.    if (/$r/) {
  6.      s/$r/$t/g;
  7.    }
  8.  }
  9.  print;
  10. }
  11. close $fh;


On imprime la ligne après avoir effectué toutes les substitutions (mon code précédent l'imprimait à chaque substitution).
 
A+,


Message édité par gilou le 13-04-2013 à 21:24:56

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 21:45:43    

Par contre, il y a quelque chose d'ambigu dans ton énoncé:
Si tu as dans fichier 2
Irma mamanovitch est belle  
Cela doit il être transformé en  
Irma-mamanovitch est belle  
Si oui, il n'y a pas à toucher au code, mais si non, alors
il faudra remplacer  s/$r/$t/g; par  s/\b$r\b/$t/g;  
\b indique un début/fin de mot
 
A+,


Message édité par gilou le 13-04-2013 à 21:46:16

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2013 à 23:08:02    

merci beaucoup gilou , c'est très gentil , mais j'ai rencontré un autre problème , si j'ai dans mon fichier fich2 il ya une phrase qui ne contient pas un mot de mon fichier fich1 alors la phrase ne sera pas affiché dans le résultat , par exemple :  
 
fich2 :  
je veux vendre ma voiture  
le garçon joue  
et fich1 :  
ma voiture  
mon père
alors le resultat est :  
je veux vendre ma-voiture ( ds ce cas le garçon joue ne sera pas afiiché)
comment résoudre ce problème?
 
merci d'avance

Reply

Marsh Posté le 13-04-2013 à 23:34:48    

Vous ne voulez pas afficher les phrases qui ne sont pas modifiées, c'est ça?
Il suffit de positionner un indicateur quand une phrase est modifiée, et de conditionner l'affichage à la valeur de l'indicateur.
 

Code :
  1. foreach (<$fh> ) {
  2.  my $flag = 0;
  3.  foreach my $r (@biwords) {
  4.    my $t = $r =~ s/ /-/r;
  5.    if (/$r/) {
  6.      s/\b$r\b/$t/g;
  7.      ++$flag;
  8.    }
  9.  }
  10.  print if ($flag);
  11. }


A+,


Message édité par gilou le 13-04-2013 à 23:35:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-04-2013 à 20:34:56    

Non , par contre je veux afficher la phrase s'il n'est pas modifié

Reply

Marsh Posté le 14-04-2013 à 20:37:46    

Bonsoir ,
MErci pour vos explications , merci pour votre patience , mon problème est résolu, je suis très reconnaissante


Message édité par rim_enis le 14-04-2013 à 20:47:48
Reply

Marsh Posté le 14-04-2013 à 21:25:45    

rim_enis a écrit :

Non , par contre je veux afficher la phrase s'il n'est pas modifié

C'est ce qu'il faisait. Et donc je comprenais pas pourquoi vous le demandiez explicitement, et j'ai pensé que vous demandiez autre chose.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed