Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
907 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Remplacer un mot dans un fichier

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Remplacer un mot dans un fichier

n°2185752
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 17:00:31  profilanswer
 

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

mood
Publicité
Posté le 13-04-2013 à 17:00:31  profilanswer
 

n°2185757
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 18:06:05  profilanswer
 

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é!  --
n°2185758
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 18:29:03  profilanswer
 

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"

n°2185759
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 18:47:20  profilanswer
 

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é!  --
n°2185760
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 18:51:01  profilanswer
 

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

n°2185761
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 18:54:19  profilanswer
 

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é!  --
n°2185762
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 18:54:52  profilanswer
 

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

n°2185763
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 18:56:32  profilanswer
 

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

n°2185764
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 19:04:32  profilanswer
 

SVP j'attend votre aide

n°2185765
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 19:33:21  profilanswer
 

?? 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é!  --
mood
Publicité
Posté le 13-04-2013 à 19:33:21  profilanswer
 

n°2185766
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 19:35:09  profilanswer
 

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

n°2185767
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 19:38:15  profilanswer
 

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é!  --
n°2185768
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 19:39:37  profilanswer
 

oui avec compte administrateur

n°2185769
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 19:41:34  profilanswer
 

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é!  --
n°2185770
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 20:03:37  profilanswer
 

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é!  --
n°2185771
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 20:26:12  profilanswer
 

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

n°2185772
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 21:20:55  profilanswer
 

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é!  --
n°2185773
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 21:45:43  profilanswer
 

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é!  --
n°2185777
rim_enis
j'aime ENIS
Posté le 13-04-2013 à 23:08:02  profilanswer
 

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

n°2185779
gilou
Modérateur
Modzilla
Posté le 13-04-2013 à 23:34:48  profilanswer
 

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é!  --
n°2185791
rim_enis
j'aime ENIS
Posté le 14-04-2013 à 20:34:56  profilanswer
 

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

n°2185792
rim_enis
j'aime ENIS
Posté le 14-04-2013 à 20:37:46  profilanswer
 

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
n°2185795
gilou
Modérateur
Modzilla
Posté le 14-04-2013 à 21:25:45  profilanswer
 

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é!  --
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Remplacer un mot dans un fichier

 

Sujets relatifs
Remplacer une partie de texte par une autre dans un fichier textecmt remplacer le contenu d'1 div par celui d'1 fichier XML (suite)?
comment remplacer le contenu d'une div par celui d'un fichier?Ecire et remplacer caractère dans un fichier txt
Remplacer une chaine multiple dans un fichierRemplacer une lettre wchar_t par une autre dans un fichier. (Unicode)
[Shell] Remplacer des infos dans un fichierBase de donnée pour remplacer lignes d'un fichier texte
Remplacer du texte dans un fichier[Résolu] Remplacer des caractères par d'autres dans un fichier texte
Plus de sujets relatifs à : Remplacer un mot dans un fichier


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR