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

  FORUM HardWare.fr
  Programmation
  Perl

  supprimer les lignes commençant par un mot

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

supprimer les lignes commençant par un mot

n°2295168
mouda
Posté le 24-01-2017 à 14:50:16  profilanswer
 

Bonjour,
 
dans un fichier, je veux supprimer toutes les lignes commençant par le mot :وقال (fichier en arabe),  
voici mon code
 

Code :
  1. #!/usr/bin/env perl
  2.    use strict;
  3.    use warnings;
  4.    use autodie;
  5.    use utf8;
  6.  
  7.  
  8. open(my $fh, "<:utf8", '/home/lenovo/Bureau/txt_to_xml/exple.odt') or die "Failed to open file: $!\n";
  9.  
  10. open my $fh1, ">:utf8", '/home/lenovo/Bureau/txt_to_xml/res.txt';
  11.  
  12.  
  13.  
  14. my @save = <$fh>;
  15. #close(FILE);
  16. foreach (@save)
  17. {
  18. $_ = "" if ($_ =~ /^":وقال"/);
  19. chomp $_;
  20. }
  21.  
  22.  
  23. foreach (@save)
  24. {
  25. print $fh1 $_."\n" if ($_);
  26. }
  27. #close(FILE);


 
Mais pas de résultat correct, y'a t'il quelqu'un qui peut m'aider SVP ?

mood
Publicité
Posté le 24-01-2017 à 14:50:16  profilanswer
 

n°2295170
gilou
Modérateur
Modzilla
Posté le 24-01-2017 à 15:52:05  profilanswer
 

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. open my $fh,  "<", '/home/lenovo/Bureau/txt_to_xml/exple.odt';
  7. open my $fh1  ">", '/home/lenovo/Bureau/txt_to_xml/res.txt';
  8. while (<$fh> ) {
  9.    s/^":وقال"//;
  10.    print $fh1 $_; # ca marche peut être même avec juste print $fh1;
  11. }
  12. close $fh1;
  13. close $fh2;


Je n'ai pas testé, car je suis au boulot, mais un truc comme ceci devrait le faire.
 
A+,


Message édité par gilou le 24-01-2017 à 15:55:22

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2295171
mouda
Posté le 24-01-2017 à 16:56:17  profilanswer
 

Merci beaucoup pour votre réponse gilou, mais ce programme ne donne pas le bon résultat, en fait j'ai changé un peu le teste comme ça :  

Code :
  1. if ($_ =~ /^وقال/)
  2.  
  3.  
  4.     {
  5.     $_ = "";
  6.     }


 
j'ai deux autres questions si bien sûre vous me permettez :  
 
si maintenant j'ai des autres mots à part ":وقال" pour faire le teste , comment je peux modifier l'expression régulière ?  
 
La deuxième question comment je peux supprimer de mon fichier toute ligne ne contenant pas ":" ?
 
Merci d'avance


Message édité par mouda le 24-01-2017 à 17:34:02
n°2295179
mouda
Posté le 24-01-2017 à 18:48:56  profilanswer
 

Bah j'ai résolu le problème, peut re le code n'est pas optimisé mais il me semble qu'il donne des résultats corrects, voici le code

Code :
  1. #!/usr/bin/env perl
  2.    use strict;
  3.    use warnings;
  4.    use autodie;
  5.    use utf8;
  6.  
  7.  
  8. open(my $fh, "<:utf8", '/home/lenovo/Bureau/txt_to_xml/exple') or die "Failed to open file: $!\n";
  9.  
  10. open my $fh1, ">:utf8", '/home/lenovo/Bureau/txt_to_xml/res.txt';
  11.  
  12.  
  13.  
  14. my @save = <$fh>;
  15.  
  16.  
  17. foreach (@save)
  18. {
  19.  if ($_ =~ /^وقال/)
  20.  
  21.  
  22.     {
  23.     $_ = "";
  24.     }
  25.  
  26.  if ($_ =~ /^وتقول/)
  27.  
  28.  
  29.     {
  30.     $_ = "";
  31.     }
  32.  
  33.  
  34.  
  35.  if ($_ =~ /^قال/)
  36.  
  37.  
  38.     {
  39.     $_ = "";
  40.     }
  41.  
  42.  if ($_ =~ /^تقول/)
  43.  
  44.  
  45.     {
  46.     $_ = "";
  47.     }
  48.  
  49.  if ($_ =~ /^باب/)
  50.  
  51.  
  52.     {
  53.     $_ = "";
  54.     }
  55.  
  56.  if ($_ =~ /^وقالا/)
  57.  
  58.  
  59.     {
  60.     $_ = "";
  61.     }
  62.  
  63.  if ($_ =~ /^يقول/)
  64.  
  65.  
  66.     {
  67.     $_ = "";
  68.     }
  69.  
  70.  if ($_ =~ /^وأنشد/)
  71.  
  72.  
  73.     {
  74.     $_ = "";
  75.     }
  76.  
  77.  
  78.  if ($_ =~ /^أنشد/)
  79.  
  80.  
  81.     {
  82.     $_ = "";
  83.     }
  84.  
  85. if ($_ =~ /^يقال/)
  86.  
  87.  
  88.     {
  89.     $_ = "";
  90.     }
  91.  
  92. if ($_ =~ /^أي/)
  93.  
  94.  
  95.     {
  96.     $_ = "";
  97.     }
  98.  
  99.  
  100.  
  101. if ($_ =~ /^ويقال/)
  102.  
  103.  
  104.     {
  105.     $_ = "";
  106.     }
  107.  
  108. if ($_ =~ /^سقول/)
  109.  
  110.  
  111.     {
  112.     $_ = "";
  113.     }
  114.  
  115.  
  116.  if ($_ !~ m/:/)
  117.  
  118.  
  119.     {
  120.     $_ = "";
  121.     }
  122.  
  123.  
  124. chomp $_;
  125. }
  126.  
  127.  
  128. foreach (@save)
  129. {
  130. print $fh1 $_."\n" if ($_);
  131. }


 
******************************
 
pour supprimer les lignes qui ne contiennent pas deux points cette condition est juste ?  

Code :
  1. if ($_ !~ m/:/)

 
 
dans le me contexte pour un fichier de type:  
الأَوْقُ: الثقل؛ يقال: ألقى عليَّ أَوْقَه. وتقول: أما والله لتجدنه عليك ذا أوق
المأفول، من الرجال: الذي لا يجدونه على ما ظنوا به، في القتال وغيره.
الأَفِيقُ: الجلد الذي قد دبغ ولم يُقطع.
 
je veux extraire le premier mot suivi de deux points (en effet je veux traiter seulement les lignes commençant par un seul mot (non pas deux ou plus) suivi de deux points) et la chaine de caractère se trouvant après le deuc points, j'ai essayé ce code mais il traite meme le cas ou ils existent deux mots au début de la ligne

Code :
  1. use strict;
  2. use warnings;
  3. use autodie;
  4.  
  5. open(my $fh, "<:utf8", '/home/lenovo/Bureau/txt_to_xml/res.txt') or die "Failed to open file: $!\n";
  6.  
  7. open my $fh1, ">:utf8", '/home/lenovo/Bureau/txt_to_xml/jim.xml';
  8.  
  9.  
  10.  
  11.  
  12.  
  13. while (<$fh> ) {
  14.    if (/^(.*)(:)([^\s])(.*)/)  {
  15.    print $fh1 "<entry form=\"$1\">\n";
  16.    print $fh1 "\t<defs>\n";
  17.    print $fh1 "\t\t<gloss>$3</gloss>\n";
  18.    print $fh1 "\t</defs>\n";
  19.    print $fh1 "</entry>\n\n\n";
  20.    }
  21. }
  22. close $fh1;
  23. close $fh;
  24.  
  25.  
  26. Merci beaucoup d'avance.


Message édité par gilou le 24-01-2017 à 23:06:46
n°2295183
gilou
Modérateur
Modzilla
Posté le 24-01-2017 à 23:06:14  profilanswer
 

Ah! Au boulot j'avais lu trop vite, je croyais que vous vouliez juste supprimer le mot, pas toute la ligne.
Ce que vous voulez, c'est:

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.    
  6. open my $fh,  "<", '/home/lenovo/Bureau/txt_to_xml/exple.odt';
  7. open my $fh1  ">", '/home/lenovo/Bureau/txt_to_xml/res.txt';
  8. while (<$fh> ) {
  9.    next if (/^:وقال/);
  10.    print $fh1 $_; # ca marche peut être même avec juste print $fh1;
  11. }
  12. close $fh1;
  13. close $fh2;


et pour plusieurs mots possibles en début de ligne a sauter:
next if (/^(وقال|وقال|وتقول|ويقال)/);
J'en ai mis que 4.
 
Pour supprimer les lignes sans : je ferais
next unless (/:/);
 
Pour le reste
 if (/^\s*(.*?)\s*:\s*(.*?)\s*$/)  {  
devrait mettre ce qu'il faut dans $1 et $2.
 
(.*): c'est le comportement par défaut: il va essayer de mettre dans le groupe un maximum de caractères suivis de : donc il va absorber un premier : s'il y en a deux et qu'il s'il matche la suite avec le reste de l'expression régulière
(.*?): c'est le comportement par inverse: il va essayer de mettre dans le groupe un minimum de caractères suivis de : donc il va s’arrêter au premier : s'il matche la suite avec le reste de l'expression régulière
 
 
A+,


Message édité par gilou le 24-01-2017 à 23:14:44

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2295191
mouda
Posté le 25-01-2017 à 09:42:59  profilanswer
 

Bonjour gilou et merci beaucoup pour vos réponses,  
mais l'expression ne donne pas vraiment ce que je souhaite en effet: si je fait :  

Code :
  1. if (/^\s*(.*?)\s*:\s*(.*?)\s*$/)   {
  2.  
  3.  
  4.  
  5.    print $fh1 "<entry form=\"$1\">\n";
  6.    print $fh1 "\t<defs>\n";
  7.    print $fh1 "\t\t<gloss>$2</gloss>\n";
  8.    print $fh1 "\t</defs>\n";
  9.    print $fh1 "</entry>\n\n\n";
  10.    }


 
si j'ai le texte suivant:
الأَوْقُ: الثقل؛  
المأفول، من الرجال: الذي لا يجدونه على ما ظنوا به، في القتال وغيره
الأَفِيقُ: الجلد الذي قد دبغ ولم يُقطع
ونشطت العقدة، إذا جعلتها بأُنشوطة؛ وأنشطها: حلَّها
 
le résultat est;  
<entry form="الأَوْقُ">
 <defs>
  <gloss>الثقل؛</gloss>
 </defs>
</entry>
 
 
<entry form="المأفول، من الرجال">
 <defs>
  <gloss>الذي لا يجدونه على ما ظنوا به، في القتال وغيره.</gloss>
 </defs>
</entry>
 
 
<entry form="الأَفِيقُ">
 <defs>
  <gloss>الجلد الذي قد دبغ ولم يُقطع.</gloss>
 </defs>
</entry>
 
<entry form="ونشطت العقدة، إذا جعلتها بأُنشوطة؛ وأنشطها">
 <defs>
  <gloss>حلَّها.</gloss>
 </defs>
</entry>
 
alors je veux seulement  afficher :
 
<entry form="الأَوْقُ">
 <defs>
  <gloss>الثقل؛</gloss>
 </defs>
</entry>
 
 
 
 
 
<entry form="الأَفِيقُ">
 <defs>
  <gloss>الجلد الذي قد دبغ ولم يُقطع.</gloss>
 </defs>
</entry>
 
 
 

n°2295221
gilou
Modérateur
Modzilla
Posté le 25-01-2017 à 21:08:32  profilanswer
 

Ah! Une fois de plus, j'avais lu trop vite votre post.
 
Donc vous voulez sauter les lignes ou on a deux mots avant le : et donc un blanc entre les deux mots.
Remplacer le
if (/^\s*(.*?)\s*:\s*(.*?)\s*$/)
par
if (/^\s*(\S*?)\s*:\s*(.*?)\s*$/)
\S représente l’opposé de \s et donc \S* va matcher toute suite de caractère qui ne contient pas de \s
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2295246
mouda
Posté le 26-01-2017 à 13:50:10  profilanswer
 

Merci énormément je vais voir ce code

n°2295264
mouda
Posté le 26-01-2017 à 23:11:06  profilanswer
 

Bonsoir gilou,
 
Je trouve souvent des difficultés avec les expressions régulières ..
donc je veux afficher seulement les lignes qui se termine par un point par exemple : .والعمهوج: الطويلة الجميلة    
 
j'aiessayé ce code :

Code :
  1. next unless (/^\s*(\S*?)\s*:\s*(.*?\.{1}$)/);


mais il m'affiche aussi des lignes de cette forme : .والعضدة: التي تجيء من جانب الحوض وهي العضادة من الحوض. وقال العوام العبسي: عضد، يعني جانب الحوض


Message édité par mouda le 27-01-2017 à 14:32:34
n°2295289
gilou
Modérateur
Modzilla
Posté le 27-01-2017 à 14:32:57  profilanswer
 

Elle se termine bien avec un point cette ligne.  
 
A+,


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

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

  supprimer les lignes commençant par un mot

 

Sujets relatifs
Lier les lignes d'une tableComment faire des lignes brisées ?
Word / supprimer certains caractères entre deux balisesfusions de plusieurs lignes dans différentes colonnes
Afficher plusieurs lignes sur une seuleSupprimer derniere ligne d'un fichier SANS le parcourir
Fusion de lignes sur excel[Résolu] VBS Passer droits administrateur=> delete des imprimantes
Supprimer un message avec OPTION "DEL" pour messagerie interneDelphi : supprimer une ligne dans un DBgrid à partir d'un bouton
Plus de sujets relatifs à : supprimer les lignes commençant par un mot


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