split + perl

split + perl - Perl - Programmation

Marsh Posté le 05-11-2013 à 16:15:33    

Bonjour ,
 
J'ai un fichier .xml contenat des textes en arabe , en fait je veux enlever tous ce qui est balise xml , point virgule , point d'exclamation etc ... voici mon code :  
 

Code :
  1. #Script de nettoyage de corpus : de XML TO TXT
  2. #!/usr/bin/perl
  3. use File::Spec;
  4. use strict;
  5. use utf8;
  6. my $RepBase ='/home/hp/Bureau/';
  7. my $FicAraInt = File::Spec->catfile( $RepBase, 'corpustravail.xml');
  8. my $FicAraOut = File::Spec->catfile( $RepBase, 'CorpusNettoye.txt');
  9. open (IN_Ara, "<:utf8",  $FicAraInt ) or die "erreur d'ouverture.";
  10. open (OUT_Ara, ">:utf8", $FicAraOut ) or die "Impossible ouvrir fichier $FicAraOut en sortie\n";
  11. while(<IN_Ara> ){
  12. #Supprimer les espaces en debut et en fin  de la chaine
  13. $_ =~ s/ +$//g;
  14. $_ =~ s/^\s+//;  
  15. #Enlever le debut de fichier xml
  16. $_ =~ s/\<\?[a-z]+\s[a-z]+\=\"[0-9]\.[0-9]\"\s[a-z]+\=\"[A-Z]+\-[0-9]\"\?\>//g;
  17. #remplacer plusieurs ! par un seul
  18. $_ =~ s/\!+/ !/g;
  19. #Enlever ; et le ,
  20. $_ =~ s/[;,]//g;
  21. #supprimer point d'interrogation en arabe
  22. $_ =~ s/\x{061F}/ \x{061F}/g;
  23. #supprimer point virgule en arabe
  24. $_ =~ s/\x{066C}/ /g;
  25. $_ =~ s/\x{066B}/ /g;
  26. $_ =~ s/\x{060C}/ /g;
  27. #supprimer les expressions regulieres
  28. $_ =~ s/\,//g;
  29. $_ =~ s/\;//g;  
  30. $_ =~ s/\*//g;  
  31. $_ =~ s/\-//g;   
  32. $_ =~ s/\_//g;
  33. $_ =~ s/\[//g;
  34. $_ =~ s/\]//g;
  35. $_ =~ s/\(//g;  
  36. $_ =~ s/\)//g;
  37. $_ =~ s/\{//g;  
  38. $_ =~ s/\}//g;     
  39. $_ =~ s/\'//g;  
  40. $_ =~ s/\"//g;
  41. $_ =~ s/\&//g;
  42. $_ =~ s/\|//g;   
  43. $_ =~ s/\///g;
  44. $_ =~ s/\\//g;  
  45. $_ =~ s/\+//g;  
  46. #supprimer les deux points
  47. $_ =~ s/\://g;
  48. #remplacer plusieurs points par un seul
  49. #$_ =~ s/\.+/ \x{061b} /g;
  50. #$_ =~ s/\.+/ \x{061b} /g;
  51. #remplacer les points par \n
  52. #$_ =~ s/\./\\n/g;
  53. #Enlever les balise xml
  54. $_ =~ s/\<[A-Z]+\>//g;  
  55. $_ =~ s/\<[A-Z]+[a-z]+\>//g;  
  56. $_ =~ s/\<[A-Z]+[a-z]+\>//i;  
  57. $_ =~ s/\<[A-Z]+\>//i;   
  58. $_ =~ s/\<[a-z]+\>//i;  
  59. $_ =~ s/\<[a-z]+\>//g;  
  60. #Enlever les \n
  61. #$_ =~ s/\\[a-z]//g;
  62. #Supprimer toute combinaison d'espaces et tabulations
  63. $_ =~s/[ \t]+/ /g;
  64. #Remplacer plusieurs espaces par un seul
  65. $_ =~s/ +/ /g;
  66. #Supprimer les lignes vides
  67. $_ =~ s/^\s+//;  
  68. print OUT_Ara $_;
  69. }


 
 
je veux savoir pkoi dans l'affichage au lieu de m'afficher : .أَيْ تْفَضَّلْ خُويَا
 
il m'affiche : le mme phrase mais le point est au debut ( càd à droite )  
 
 
 
mon deuxième problème est avec le split , en effet je veux spliter mon texte en se basant seulement sur les espace voici mon code :  
#Script de Segmentation de corpus en mots  
 
use File::Spec;  
use strict;
use utf8;
 
 
my $RepBase ='/home/hp/Bureau/';
 
my $FicAraInt = File::Spec->catfile( $RepBase, 'CorpusNettoye.txt');
my $FicAraOut = File::Spec->catfile( $RepBase, 'tata.txt');
 
open (IN_Ara, "<",  $FicAraInt ) or die "erreur d'ouverture.";
 
open (OUT_Ara, ">", $FicAraOut ) or die "Impossible ouvrir fichier $FicAraOut en sortie\n";
 
my @tab = <IN_Ara>;
my $size = $#tab+1;  
 
for (my $i = 0; $i < $size; $i++)
{
 chomp();
 chomp($tab[$i]);
 #my @words = split /(?<!-)(\b|\x{061F}|\x{061B})(?!-)/;  
 my @words = split(/ /, $tab[$i]);
 chomp();
 foreach my $val ( @words )  
 {
     chomp();
        chomp($val);
     print OUT_Ara "$val\n"; chomp($val);
 }
 
}
 
 
 
 
 
   
 
le problème lorsque il ya des mots tels que :  il le decompose en deux alors que c'est un seul mot !!!  
 
exemple dans cette phrase :
 
مَاضِي-سَاعَةْ وَ أَرْبْعَةْ
 
le resultat est normalement :  
مَاضِي-سَاعَةْ  
وَ
 أَرْبْعَةْ
 
mais le resultat :  
مَاضِي
سَاعَةْ  
وَ
 أَرْبْعَةْ
 
 
 

Reply

Marsh Posté le 05-11-2013 à 16:15:33   

Reply

Marsh Posté le 06-11-2013 à 03:12:01    

Citation :

le problème lorsque il ya des mots tels que :  il le decompose en deux alors que c'est un seul mot !!!  
 
exemple dans cette phrase :
 
مَاضِي-سَاعَةْ وَ أَرْبْعَةْ
 
le resultat est normalement :  
مَاضِي-سَاعَةْ  
وَ
 أَرْبْعَةْ
 
mais le resultat :  
مَاضِي
سَاعَةْ  
وَ
 أَرْبْعَةْ


Non, chez moi ce code marche correctement avec les fichiers CorpusNettoye.txt et tata.txt en utf-8 et les ouvertures avec  
open (IN_Ara, "<:utf-8",  $FicAraInt ) or die "erreur d'ouverture.";
open (OUT_Ara, ">:utf-8", $FicAraOut ) or die "Impossible ouvrir fichier $FicAraOut en sortie\n";
 

Citation :

je veux savoir pkoi dans l'affichage au lieu de m'afficher : .أَيْ تْفَضَّلْ خُويَا
 
il m'affiche : le mme phrase mais le point est au debut ( càd à droite )  


Pareil, en utilisant des fichiers en UTF-8 je n'ai pas de déplacement du point dans le fichier d'arrivée.
 
 
A+,


Message édité par gilou le 06-11-2013 à 03:29:30

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

Marsh Posté le 06-11-2013 à 08:58:21    

pour la segmentation c'est bon , mais pour le nettoayage de corpus ,  
 
 
car au lieu de m'afficher :  
. أَيْ تْفَضَّلْ خُويَا  
مْعَ وَقْتَاشْ بِاللهْ التْرَانْ يِمْشِي ؟
. مَاضِي سَاعَةْ وَ أَرْبْعَةْ
 
 
il m'affiche :  
   أَيْ تْفَضَّلْ خُويَا.
مْعَ وَقْتَاشْ بِاللهْ التْرَانْ يِمْشِي ؟
مَاضِي سَاعَةْ وَ أَرْبْعَةْ.
 
le problème seulement avec les points ( les points d'interrogation restent à gauche ) !!!!!!  est ce que le problème parceque je suis sous ubunto ???

Reply

Marsh Posté le 06-11-2013 à 11:42:54    

Il me faudrait vôtre fichier de départ pour que je puisse tester.
A+,


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

Marsh Posté le 06-11-2013 à 11:52:44    

voilà mon fichier de depart :  
 
 
<dialogue>
  <Agent>.أَيْ تْفَضَّلْ خُويَا </Agent>
        <Client>مْعَ وَقْتَاشْ بِاللهْ التْرَانْ يِمْشِي ؟</Client>
        <Agent>.مَاضِي سَاعَةْ وَ أَرْبْعَةْ</Agent>
        <Client>مَا ثَمَّاشْ وَاحِدْ آخِرْ تَوَّةْ؟</Client>
        <Agent>.لاَ هَاكَ هَذَاكَ هُوَ</Agent>
        <Client>ثَمَّاشِي وَاحِدْ آخِرْ بَعْدُو؟</Client>
        <Agent> ثَمَّةْ الحْدَاشْ مْتَاعْ اللِيلْ </Agent>
 </dialogue>
 
 <dialogue>
  <Client>سَلَامُ عَلَيْكُمْ بِاللهْ تِكَايْ لْتُونِسْ بْقَدَّاهْ ؟</Client>
        <Agent>ثْنَاشْ وُ تْسْعَةْ مِيَّةْ</Agent>
 </dialogue>
 
 <dialogue>
  <Client>.سَلَامُ عَلَيْكُمْ</Client>
        <Client>.زُوزْ  زُوزْ لْتُونِسْ</Client>
        <Client>وَقْتَاشْ يُخْرِجْ هُوَ؟</Client>
        <Agent>.مَاضِي سَاعَةْ وُ رْبُعْ</Agent>
 </dialogue>
 
 <dialogue>
  <Agent>.أَيْ خُويَا</Agent>
        <Client>بِاللهْ  تِسْكْرَةْ لْتُونِسْ مَاضِي سَاعَةْ</Client>
        <Client>مَاضِي سَاعَةْ وُ قَدَّاشْ هُوَ؟</Client>
        <Agent>وُ رْبُعْ حْدَاشْ وُ تْسْعَةْ مِيَّةْ</Agent>
        <Agent>شُوفْلِي تْسْعَةْ مِيَّةْ يْعَيِّشِكْ</Agent>
        <Client>.مَا عَنْدِيشْ تِسْعَةْ مِيَّةْ</Client>
        <Agent>خَمْسَةْ آلاَفْ عَنْدِكْشِي؟</Agent>
        <Agent>.بَرَّةْ جِيبْلِي أَلْفِينْ</Agent>
 </dialogue>

Reply

Marsh Posté le 06-11-2013 à 14:28:04    

Ben non. Avec votre code modifié pour travailler dans mon répertoire de travail:

Code :
  1. #Script de nettoyage de corpus : de XML TO TXT
  2. #!/usr/bin/perl
  3. use File::Spec;
  4. use strict;
  5. use utf8;
  6.  
  7.  
  8. # my $RepBase ='/home/hp/Bureau/';
  9. # my $FicAraInt = File::Spec->catfile( $RepBase, 'corpustravail.xml');
  10. # my $FicAraOut = File::Spec->catfile( $RepBase, 'CorpusNettoye.txt');
  11. # open (IN_Ara, "<:utf8",  $FicAraInt ) or die "erreur d'ouverture.";
  12. # open (OUT_Ara, ">:utf8", $FicAraOut ) or die "Impossible ouvrir fichier $FicAraOut en sortie\n";
  13.  
  14. my $RepBase ='.';
  15. my $FicAraInt = File::Spec->catfile( $RepBase, 'indata1.txt');
  16. my $FicAraOut = File::Spec->catfile( $RepBase, 'outdata1.txt');
  17.  
  18. open (IN_Ara, "<:utf8",  $FicAraInt ) or die "erreur d'ouverture.";
  19. open (OUT_Ara, ">:utf8", $FicAraOut ) or die "Impossible ouvrir fichier $FicAraOut en sortie\n";
  20.  
  21. while (<IN_Ara> ) {
  22.  #Supprimer les espaces en debut et en fin  de la chaine
  23.  $_ =~ s/ +$//g;
  24.  $_ =~ s/^\s+//;  
  25.  #Enlever le debut de fichier xml
  26.  $_ =~ s/\<\?[a-z]+\s[a-z]+\=\"[0-9]\.[0-9]\"\s[a-z]+\=\"[A-Z]+\-[0-9]\"\?\&gt;//g;
  27.  #remplacer plusieurs ! par un seul
  28.  $_ =~ s/\!+/ !/g;
  29.  #Enlever ; et le ,
  30.  $_ =~ s/[;,]//g;
  31.  #supprimer point d'interrogation en arabe
  32.  $_ =~ s/\x{061F}/ \x{061F}/g;
  33.  #supprimer point virgule en arabe
  34.  $_ =~ s/\x{066C}/ /g;
  35.  $_ =~ s/\x{066B}/ /g;
  36.  $_ =~ s/\x{060C}/ /g;
  37.  #supprimer les expressions regulieres
  38.  $_ =~ s/\,//g;
  39.  $_ =~ s/\;//g;
  40.  $_ =~ s/\*//g;
  41.  $_ =~ s/\-//g;
  42.  $_ =~ s/\_//g;
  43.  $_ =~ s/\[//g;
  44.  $_ =~ s/\]//g;
  45.  $_ =~ s/\(//g;
  46.  $_ =~ s/\)//g;
  47.  $_ =~ s/\{//g;
  48.  $_ =~ s/\}//g;
  49.  $_ =~ s/\'//g;
  50.  $_ =~ s/\"//g;
  51.  $_ =~ s/\&amp;//g;
  52.  $_ =~ s/\|//g;
  53.  $_ =~ s/\///g;
  54.  $_ =~ s/\\//g;
  55.  $_ =~ s/\+//g;
  56.  #supprimer les deux points
  57.  $_ =~ s/\://g;
  58.  #remplacer plusieurs points par un seul
  59.  #$_ =~ s/\.+/ \x{061b} /g;
  60.  #$_ =~ s/\.+/ \x{061b} /g;
  61.  #remplacer les points par \n
  62.  #$_ =~ s/\./\\n/g;
  63.  #Enlever les balise xml
  64.  $_ =~ s/\&lt;[A-Z]+\&gt;//g;
  65.  $_ =~ s/\&lt;[A-Z]+[a-z]+\&gt;//g;
  66.  $_ =~ s/\&lt;[A-Z]+[a-z]+\&gt;//i;
  67.  $_ =~ s/\&lt;[A-Z]+\&gt;//i;
  68.  $_ =~ s/\&lt;[a-z]+\&gt;//i;
  69.  $_ =~ s/\&lt;[a-z]+\&gt;//g;
  70.  #Enlever les \n
  71.  #$_ =~ s/\\[a-z]//g;
  72.  #Supprimer toute combinaison d'espaces et tabulations
  73.  $_ =~s/[ \t]+/ /g;
  74.  #Remplacer plusieurs espaces par un seul
  75.  $_ =~s/ +/ /g;
  76.  #Supprimer les lignes vides
  77.  $_ =~ s/^\s+//;
  78.  print OUT_Ara $_;
  79. }


 
et en copiant-collant votre source sous notepad et en le sauvant en utf-8, j'obtiens un résultat correct:
 

.أَيْ تْفَضَّلْ خُويَا  
مْعَ وَقْتَاشْ بِاللهْ التْرَانْ يِمْشِي ؟
.مَاضِي سَاعَةْ وَ أَرْبْعَةْ
مَا ثَمَّاشْ وَاحِدْ آخِرْ تَوَّةْ ؟
.لاَ هَاكَ هَذَاكَ هُوَ
ثَمَّاشِي وَاحِدْ آخِرْ بَعْدُو ؟
ثَمَّةْ الحْدَاشْ مْتَاعْ اللِيلْ  
سَلَامُ عَلَيْكُمْ بِاللهْ تِكَايْ لْتُونِسْ بْقَدَّاهْ ؟
ثْنَاشْ وُ تْسْعَةْ مِيَّةْ
.سَلَامُ عَلَيْكُمْ
.زُوزْ زُوزْ لْتُونِسْ
وَقْتَاشْ يُخْرِجْ هُوَ ؟
.مَاضِي سَاعَةْ وُ رْبُعْ
.أَيْ خُويَا
بِاللهْ تِسْكْرَةْ لْتُونِسْ مَاضِي سَاعَةْ
مَاضِي سَاعَةْ وُ قَدَّاشْ هُوَ ؟
وُ رْبُعْ حْدَاشْ وُ تْسْعَةْ مِيَّةْ
شُوفْلِي تْسْعَةْ مِيَّةْ يْعَيِّشِكْ
.مَا عَنْدِيشْ تِسْعَةْ مِيَّةْ
خَمْسَةْ آلاَفْ عَنْدِكْشِي ؟
.بَرَّةْ جِيبْلِي أَلْفِينْ


A+,


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

Marsh Posté le 06-11-2013 à 14:55:29    

ça marche pas pour moi ; en fait le chagement de code de :  
 

Code :
  1. $_ =~ s/\<[A-Z]+\>//g;  
  2. $_ =~ s/\<[A-Z]+[a-z]+\>//g;  
  3. $_ =~ s/\<[A-Z]+[a-z]+\>//i;  
  4. $_ =~ s/\<[A-Z]+\>//i;   
  5. $_ =~ s/\<[a-z]+\>//i;  
  6. $_ =~ s/\<[a-z]+\>//g;


vers  

Code :
  1. $_ =~ s/\&lt;[A-Z]+\&gt;//g;
  2. $_ =~ s/\&lt;[A-Z]+[a-z]+\&gt;//g;
  3. $_ =~ s/\&lt;[A-Z]+[a-z]+\&gt;//i;
  4. $_ =~ s/\&lt;[A-Z]+\&gt;//i;
  5. $_ =~ s/\&lt;[a-z]+\&gt;//i;
  6. $_ =~ s/\&lt;[a-z]+\&gt;//g;


 
les balises xml ds ce cas ne sont pas supprimé

Reply

Marsh Posté le 06-11-2013 à 15:38:12    

Je n'ai pas fait de changement de code du tout (sauf pour les noms de fichiers et le fait qu'ils sont explicitement en utf-8).
Manifestement, c'est le code du forum qui a transformé les < en &lt; quand j'ai fait un copier-coller.
A+,


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

Marsh Posté le 06-11-2013 à 15:40:30    

alors le mme problème persiste encore pour moi toujours le point est au debut de la phrase et non pas à la fin !!!  
 
 
une autre question gilou SVP :  
après avoir afficher le continu d'un fichier dans un Scrolled , je veux executer une autre fonction et affficher le resultat dans le meme Scrolled , cependant le texte s'ajoute tjours , j'ai fait : $txt->delete(0,'end'); mais dans ce cas l'ancien texte est supprimer et le resultat ne s'affiche pas !! que dois je faire !!
merci d'avance

Reply

Marsh Posté le 06-11-2013 à 16:32:56    

Ce genre d'exemple n'est pas explicite?
 

Code :
  1. use warnings;
  2. use strict;
  3. use Tk;
  4.  
  5. my $text = "This is a scrolled widget.";
  6. my $revtext = reverse($text);
  7. my $flip = 0;
  8.  
  9. my $mw = new MainWindow;
  10. $mw->geometry("200x100" );
  11. my $frame = $mw->Frame()->pack;
  12.  
  13. $frame->Button(-text => "Reverse Text",
  14.            -command => \&reverse_text)->pack(-side => 'top');
  15.  
  16. my $textbox = $frame->Scrolled('Text',
  17.                    -scrollbars => 'soe',
  18.                    -foreground => 'blue',
  19.                    -background => 'white',
  20.                    -wrap => 'none',
  21.                   )->pack;
  22. reverse_text();
  23.  
  24. MainLoop;
  25.  
  26. sub reverse_text {
  27.  $textbox->delete('0.0', 'end');
  28.  $textbox->insert('end', "\n\n" );
  29.  if ($flip%2) {
  30.    $textbox->insert('end', $revtext);
  31.  }
  32.  else {
  33.    $textbox->insert('end', $text);
  34.  }
  35.  ++$flip;
  36. }


 
A+,


Message édité par gilou le 06-11-2013 à 16:45:21

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

Marsh Posté le 06-11-2013 à 16:32:56   

Reply

Marsh Posté le 06-11-2013 à 18:31:11    

bsr gilou , merci en fait il suffit de changer  $textbox->delete('1.0', 'end'); : par $textbox->delete('0.0', 'end');
 
ainsi avec l'arabe j'ai tjrs des problèmes d'affichage en effet pour ouvrir un fichier contenant :  

اَ هَاكَ هَذَاكَ هُوَ
ثَمَّاشِي وَاحِدْ آخِرْ بَعْدُو  
ثَمَّ الحْدَاشْ مْتَاعْ اللِيلْ
سَلَامُ عَلَيْكُمْ بِاللَهْ تِكَايْ لْتُونِسْ بْقَدَاهْ  
ثْنَاشْ وُ تِسْعَةْ مِيَّةْ
سَلَامُ عَلَيْكُمْ
كُلْ عَامْ وَانْتِي بْخِيرْ
بَارَكَ اللهُ فِيكْ
رَبِّي يوَصْلَكْ سَالْمَةْ
يْبَارِكْ فِي عُمْرِكْ سَلَامُ عَلَيْكُمْ بِاللَهْ تِكَايْ لْتُونِسْ بْقَدَاهْ

 
voici le code :  
 

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Tk;
  5. use utf8;
  6. use encoding 'utf8';
  7. use Encode;
  8. # Programme principal
  9. # Création de la fenêtre
  10. my $fenetre = new MainWindow(
  11. -title      => 'Première fenêtre Tk',
  12. -background => 'brown',
  13. );
  14. # Affichage d'un texte
  15. my $label_accueil = $fenetre->Label(
  16. -text       => 'Bonjour tout le monde',
  17. -background => 'white',
  18. )->pack(qw/ -pady 5 /);
  19. my $widget_texte = $fenetre->Scrolled(
  20. 'Text',
  21. -scrollbars => 'osoe',
  22. -background => '#F3EFFF',
  23. )->pack(qw/ -fill both -expand 1 -padx 5 -pady 10 /);
  24. my $bouton = $fenetre->Button(
  25. -text    => 'Ouvrir un fichier',
  26. -command => [ \&ouvrir_fichier, $fenetre, $widget_texte ],
  27. )->pack(qw/ -pady 2 /);
  28. MainLoop;
  29. sub ouvrir_fichier {
  30. my ( $fenetre, $widget_text ) = @_;
  31. my $filetypes = [ [ 'Drawing Files', '.drg' ], [ 'All files', '*' ] ];
  32. my $fichier = $fenetre->getOpenFile(
  33.  -filetypes  => $filetypes,
  34.  -initialdir => "/home/hp/Bureau/Master",
  35. );
  36. # Gestion des nom de fichiers encodés (avec accents)
  37. my $OS = lc($^O);
  38. if ( $OS eq 'mswin32' and defined $fichier ) {
  39.  $fichier = encode( 'iso-8859-1', $fichier );
  40. }
  41. # Lecture du fichier et affichage dans le widget Texte
  42. open my $fh, '<:encoding(UTF-8)', $fichier or die "Impossible de lire le chier $fichier\n";
  43. while ( my $ligne = <$fh> ) {
  44.  $widget_texte->insert( 'end', $ligne );
  45.  # Rafraichir le widget
  46.  $widget_texte->update();
  47.  # Voir la dernière ligne
  48.  #$widget_text->see('end');
  49. }
  50. close $fh;
  51. }


 
 
vous pouvez testé et voir le resultat c'est une ecriture illisible , je ne sais pas la cause , qu'en pensez vous ????
 
 

Reply

Marsh Posté le 06-11-2013 à 23:34:33    

Par défaut on doit être avec une fonte systeme de taille fixe, donc le rendering est moche.
En insérant:
$widget_texte->configure(-font => [-family => 'Arial']);
après avoir défini le $widget_texte, ça devient bien bien meilleur (en partant de ton exemple de texte, sauvé dans un fichier utf8)
 

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Tk;
  5. use utf8;
  6. use encoding 'utf8';
  7. use Encode;
  8.  
  9.  
  10. # Programme principal
  11. # Création de la fenêtre
  12. my $fenetre = new MainWindow(
  13.                  -title      => "Premi\x{c3}\x{a8}re fen\x{c3}\x{aa}tre Tk",
  14.                  -background => 'brown',
  15.                 );
  16. # Affichage d'un texte
  17. my $label_accueil = $fenetre->Label(
  18.                     -text       => 'Bonjour tout le monde',
  19.                     -background => 'white',
  20.                    )->pack(qw/ -pady 5 /);
  21. my $widget_texte = $fenetre->Scrolled(
  22.                       'Text',
  23.                       -scrollbars => 'osoe',
  24.                       -background => '#F3EFFF',
  25.                      )->pack(qw/ -fill both -expand 1 -padx 5 -pady 10 /);
  26. $widget_texte->configure(-font => [-family => 'Arial']);
  27.  
  28. my $bouton = $fenetre->Button(
  29.                   -text    => 'Ouvrir un fichier',
  30.                   -command => [ \&ouvrir_fichier, $fenetre, $widget_texte ],
  31.                  )->pack(qw/ -pady 2 /);
  32. MainLoop;
  33. sub ouvrir_fichier {
  34.  my ( $fenetre, $widget_text ) = @_;
  35.  my $filetypes = [ [ 'Text Files', '.txt' ], [ 'All files', '*' ] ];
  36.  my $fichier = $fenetre->getOpenFile(
  37.                       -filetypes  => $filetypes,
  38.                       # -initialdir => "/home/hp/Bureau/Master",
  39.                       -initialdir => ".",
  40.                      );
  41.  # Gestion des nom de fichiers encodés (avec accents)
  42.  my $OS = lc($^O);
  43.  if ( $OS eq 'mswin32' and defined $fichier ) {
  44.    $fichier = encode( 'iso-8859-1', $fichier );
  45.  }
  46.  # Lecture du fichier et affichage dans le widget Texte
  47.  open my $fh, '<:encoding(UTF-8)', $fichier or die "Impossible de lire le fichier $fichier\n";
  48.  while ( <$fh> ) {
  49.    s/^\x{ef}\x{bb}\x{bf}//;  #au cas ou une BOM
  50.    $widget_texte->insert( 'end', $_ );
  51.    # Rafraichir le widget
  52.    $widget_texte->update();
  53.    # Voir la dernière ligne
  54.    #$widget_text->see('end');
  55.  }
  56.  close $fh;
  57. }


 
http://reho.st/self/55f91b64177b9541d0c52d4d5c5cd37ef4161a0d.jpg
 
Ça me semble assez correct. Bon, il y a peut être des fontes encore plus adaptées.
 
A+,


Message édité par gilou le 07-11-2013 à 00:38:25

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

Marsh Posté le 07-11-2013 à 07:44:23    

bjr,  
 
peut etre sur windows le problème est résolu mais sur ubunto l'écriture est tjrs illisible , vous pouvez testeé sur ubunto et voir le resultat !!!


Message édité par rim_enis le 07-11-2013 à 07:44:41
Reply

Marsh Posté le 07-11-2013 à 11:30:53    

Désolé, mais je n'ai pas de machine sous linux pour tester, Arial étant une fonte typiquement Windows, choisissez en une qui soit typiquement linux pour tester. S'il n'y a pas de progrès, c'est alors sans doute une limitation de Tk sous linux, et je n'ai pas de solution pour cela.
A+,


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

Marsh Posté le 07-11-2013 à 12:05:56    

sous linux il ya le font : {Simplified Arabic} mais ça ne resou pas le problème malheureusement !!!

Reply

Marsh Posté le 07-11-2013 à 15:46:57    

Si vous avez une fonte qui affiche correctement votre texte dans une fenêtre linux, choisissez celle la pour le script.
A+,


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

Marsh Posté le 09-11-2013 à 19:24:51    

bsr,
mme avec  {Simplified Arabic}  le problème reste encore !!!!

Reply

Marsh Posté le 11-11-2013 à 09:47:14    

bjr gilou,  
j'ai passé des nuits à cherché une solution à mon pblme d'affichage de l'arabe sous linux , mais malheureusement j'ai rien trouvé , sauf sur un forum voici ce qu'ils disent :
 
L'informatique ayant été inventé par des occidentaux pour des occidentaux, les alphabets complexes qui comportent notamment des caractères à échappement nul sont rarement pris en compte correctement, du moins avec les outils conçus avant l'an 2000 en gros !
Des foutoirs similaires sont observables en Word 2000 (après je ne sais pas), Ultraedit version de 2013... à ce jour je n'ai trouvé que le bloc note de Windows qui ne se comporte pas trop mal... et encore c'est une galère pour faire un copier/coller ou pour positionner un point d'exclamation ou d'interrogation...
 
Si tu dois diffuser ton application, Perl/Tk n'est pas la bonne solution, tu n'arriveras pas à afficher de l'arabe dans un scrolled text voir la longue discussion
Pour de l'affichage uniquement on obtient de vrais bons résultats en HTML...
Prospecte auprès d'informaticiens véritablement arabophones, qui pourront mieux que moi t'orienter vers des outils adaptés, s'il en existe...
 
En résumé, en arabe dans un scrolled text :
- Le texte s'il est cadré à droite, comme il se doit, il est décalé vers la gauche d'autant de caractères qu'il y à de diacritiques dans la phrase !
Si tu affichais du texte SANS diacritique se phénomène serait résolu !
 
 
SVP si vous avez compris pouvez vous m'expliquer !!!  
merci d'avance !!  

Reply

Marsh Posté le 11-11-2013 à 12:23:13    

C'est plus ou moins simple à comprendre:
Sous windows, il y a un moteur unique service de rendu des fontes qui quand on lui passe une chaîne de texte unicode, fait le travail de combinaison de caractères, calcul des positionnements et affichage. Sous Mac, c'est la même chose.  
Une application qui a besoin d'afficher du texte fait appel à ce service a travers une API système, et pratiquement toute les applications travaillent ainsi (sauf peut être celles d'Adobe, qui utilisent un moteur de rendu propriétaire).
 
Sous unix/linux, un tel service n'existe pas "en standard", puis qu'il n'y a pas de GUI standard pour ces systèmes.  
Je ne sais pas à quelle librairie Tk fait appel sous linux pour afficher du texte unicode (edit, j'ai trouvé, c'est Xft) mais si elle se comporte comme tu le dis
>> il est décalé vers la gauche d'autant de caractères qu'il y à de diacritiques dans la phrase !  
C'est qu'elle est buggée (ou que le code d'interface de Tk avec cette librairie l'est) et calcule à un moment la longueur de la ligne avec le nombre de caractères unicodes, au lieu de calculer cette longueur avec le nombre de glyphes après combinaisons. De toute façon, c'est au niveau de l'implémentation interne de Tk que ça se passe, et donc non correctible à moins de vouloir rentrer dans le code de l'implémentation de Tk (ou de ce à quoi elle fait appel)
 
Sous Linux, il existe (entre autres) un moteur de rendu, FreeType, au dessus duquel est construit une librairie, Pango, qu'utilise la GUI GTK+.
Je suppose que les applis qui font appel a GTK+ comme GUI n'ont pas le problème.
Vous pouvez donc aussi jeter un œil a Perl Gtk2, qui marche sans doute mieux pour afficher du texte en arabe.
 
A+,


Message édité par gilou le 11-11-2013 à 16:21:12

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

Marsh Posté le 12-11-2013 à 15:13:03    

Bonsoir,  
merci infiniment gilou ,
maintenant j'utilise perl gtk 2 pour resoudre le problème d'affichage de l'arabe ,  
 
je veux inserer le continu de mon fichier dans un text buffer , voici mon code :  
 
 

Code :
  1. my $textbuffer = Gtk2::TextBuffer->new();
  2. $textbuffer->set_text("بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ\n" );
  3. # Create a textview using that textbuffer 
  4. my $textview = Gtk2::TextView->new_with_buffer($textbuffer);
  5. # Add the textview to a scrolledwindow 
  6. my $scrolledwindow = Gtk2::ScrolledWindow->new( undef, undef );
  7. $scrolledwindow->add($textview);
  8. $vbox->pack_start($scrolledwindow, 1, 1, 0 );
  9. my $end_mark = $textbuffer->create_mark( 'end', $textbuffer->get_end_iter, FALSE );
  10. # every time we insert text, scroll to that mark.
  11. $textbuffer->signal_connect(
  12.     insert_text => sub {
  13.         $textview->scroll_to_mark( $end_mark, 0.0, TRUE, 0.0, 1.0 );
  14.     }
  15. );
  16. $window->show_all;


 

La fonction qui ouvre le fichier :

Code :
  1. sub open_file {
  2. my $filename = '/home/hp/Bureau/corpuss.txt';
  3. open(my $fh, '<:encoding(UTF-8)', $filename) or die "Could not open file $filename";
  4. my $row = <$fh>;
  5. $textbuffer->set_text("$row\n" );
  6. }



cependant dans mon texte buffer seulement le premier ligne du fichier est affiché , pourquoi ????

 
 
merci d'avance ..

Reply

Marsh Posté le 12-11-2013 à 15:20:19    

et voilà j'ai trouvé une solution :))))  
 

Code :
  1. sub open_file {
  2. my $filename = '/home/hp/Bureau/Master/corpuss.txt';
  3. #open(my $fh, '<:encoding(UTF-8)', $filename) or die "Could not open file $filename";
  4. #my $row = <$fh>;
  5. open FIC, '<:encoding(UTF-8)', $filename or $textbuffer->set_text("Impossib le d'ouvrir $filename" ),return;
  6.   my $texte="";
  7. while(<FIC> ) {
  8. $texte.=$_;
  9.     }
  10. $textbuffer->set_text($texte);
  11. }

Reply

Marsh Posté le 12-11-2013 à 16:11:27    

Chouette!
 
A+,


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

Marsh Posté le 12-11-2013 à 19:50:48    

bsr,
comme c'est mon premier programme avec gtk2 , je rencontre ce problème :  
 
 
avec cette procedure :  
 

Code :
  1. sub etiquetage {
  2. my $txt ="";
  3. sub parseBase ($$) {
  4.       use XML::Simple;
  5.       my $href = shift;
  6.       my $data = XMLin(shift);
  7.       foreach (@{$data->{mot}}) {
  8.         s/^\s+|\s+$//g;
  9.         next if (/^$/);
  10.         my $synonyme = $_->{'synonyme'};
  11.         next if (ref($synonyme));
  12.         $synonyme =~ s/^\s+|\s+$//g;
  13.         next if ($synonyme ~~ /^$/);
  14.         my $etiquette = $_->{'etiquette'};
  15.         next if (ref($etiquette));
  16.         $etiquette =~ s/^\s+|\s+$//g;
  17.         next if ($etiquette ~~ /^$/);
  18.         $$href{$synonyme} = $etiquette;
  19.       }
  20.     }
  21. my %syn;
  22.     parseBase(\%syn, '/home/hp/Bureau/Master/BaseEtiquetteTest.xml');
  23.     open my $fh,  "<:utf8", '/home/hp/Bureau/Master/titi.txt';
  24.     open my $fh1, ">:utf8", '/home/hp/Bureau/Master/toto.txt';
  25.     my $linenum = 0;
  26.     foreach (<$fh> ) {
  27.       # Si BOM initiale
  28.       unless ($linenum++ or not /^\x{feff}/) {
  29.         s/^\x{feff}// ;
  30.         print $fh1 "\x{feff}";
  31. $txt.="\x{feff}";
  32.       }
  33. $textbuffer->set_text("$txt" );
  34. my @words = split /(?<!-)(\b|\x{061F}|\x{061B})(?!-)/;
  35.       foreach (@words) {
  36.         s/^\s+|\s+$//g;
  37.         next if (/^$/);
  38.         next if (/^\r?\n$/); 
  39.         print $fh1 $_;
  40.         if ($syn{$_}) {
  41.           print $fh1  " $syn{$_}";
  42.         }
  43.         print $fh1  " \n";
  44.       }
  45.     }
  46.     close $fh1;
  47.     close $fh;
  48. $textbuffer->set_text("$txt" );
  49. }


 
ainsi à chaque fois je fais print $fh1   je veux ecrire aussi ds le text buffer  

Code :
  1. $textbuffer->set_text("$txt" );


cependant le programme se bloque et il n'ya pas de resultat !!

Reply

Marsh Posté le 12-11-2013 à 23:25:57    

Citation :

foreach (<$fh> ) {
      # Si BOM initiale
      unless ($linenum++ or not /^\x{feff}/) {
        s/^\x{feff}// ;
        print $fh1 "\x{feff}";
$txt.="\x{feff}";
      }
$textbuffer->set_text("$txt" );
my @words = split /(?<!-)(\b|\x{061F}|\x{061B})(?!-)/;
      foreach (@words) {
        s/^\s+|\s+$//g;
        next if (/^$/);
        next if (/^\r?\n$/);  
        print $fh1 $_;
        if ($syn{$_}) {
          print $fh1  " $syn{$_}";
        }
        print $fh1  " \n";
      }
    }
    close $fh1;
    close $fh;
$textbuffer->set_text("$txt" );


 
Avec ce que vous faites, $txt est vide ou avec juste une BOM (qui ne devrait pas être la, les BOMs c'est pour les fichiers, pas les buffers)
Ça devrait être à mon avis
 
 
foreach (<$fh> ) {
      # Si BOM initiale
      unless ($linenum++ or not /^\x{feff}/) {
        s/^\x{feff}// ;
        print $fh1 "\x{feff}";
      }
 
my @words = split /(?<!-)(\b|\x{061F}|\x{061B})(?!-)/;
      foreach (@words) {
        s/^\s+|\s+$//g;
        next if (/^$/);
        next if (/^\r?\n$/);  
        print $fh1 $_;
        $txt .= $_;
        if ($syn{$_}) {
          print $fh1  " $syn{$_}";
          $txt .= " $syn{$_}";
        }
        print $fh1  " \n";
        $txt .= " \n";
      }
    }
    close $fh1;
    close $fh;
$textbuffer->set_text("$txt" );
 
A+,


Message édité par gilou le 12-11-2013 à 23:29:40

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

Marsh Posté le 13-11-2013 à 00:51:01    

rim_enis a écrit :

Bonjour ,
je veux enlever tous ce qui est balise xml , point virgule , point d'exclamation etc ...
 


 
Ca nous rappelle les heures sombres de notre histoire ©
 
 
 
 [:theorie des lavabos]


---------------
Broadcast4Reps♥  Dreams-Cars.net | Before Black | >> Le topic du V8 <<  
Reply

Marsh Posté le 26-12-2013 à 00:14:00    

quelles heures sombre et quelle hstoire !!!!!!!!!!!!!!!!!! n'importe quoi

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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