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

  FORUM HardWare.fr
  Programmation
  Perl

  perl + xml

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

perl + xml

n°2206157
rim_enis
j'aime ENIS
Posté le 09-10-2013 à 23:43:26  profilanswer
 

Bonsoir,  
 
j'ai le code suivant :  

Code :
  1. use strict;
  2. use warnings;
  3. use autodie;
  4. use XML::TreeBuilder;
  5. my %h1;
  6. my $tree = XML::TreeBuilder->new();
  7. $tree->parse_file('/home/hp/Bureau/fic2.xml');
  8. my @mots = $tree->find('mot');
  9. foreach (@mots) {
  10.         s/^\s+|\s+$//g;
  11.         next if (/^$/);
  12. my ($synonyme, $etiquette);
  13. foreach ($_->descendants()) {
  14.    my $tag = $_->tag();
  15.    if ($tag ~~ "synonyme" ) {
  16.      $synonyme = ($_->content_list())[0];
  17.         next if (ref($synonyme));
  18.         $synonyme =~ s/^\s+|\s+$//g;
  19.         next if ($synonyme ~~ /^$/);
  20.    }
  21.    if ($tag ~~ "etiquette" ) {
  22.      $etiquette = ($_->content_list())[0];
  23.     next if (ref($etiquette));
  24.         $etiquette =~ s/^\s+|\s+$//g;
  25.         next if ($etiquette ~~ /^$/);
  26.      $h1{$synonyme} = $etiquette;
  27.    }
  28. }
  29. }
  30. $tree->delete;
  31. my %h2;
  32. $tree = XML::TreeBuilder->new();
  33. $tree->parse_file('/home/hp/Bureau/fic3.xml');
  34. my @classes = $tree->find('classe');
  35. foreach (@classes) {
  36. s/^\s+|\s+$//g;
  37.         next if (/^$/);
  38. #my $synonyme = $_->{'synonyme'};
  39.        # next if (ref($synonyme));
  40. my ($nom, $etiquette);
  41. foreach ($_->descendants()) {
  42.    my $tag = $_->tag();
  43.    if ($tag ~~ "nom" ) {
  44.      $nom = ($_->content_list())[0];
  45. next if (ref($nom));
  46.         $nom =~ s/^\s+|\s+$//g;
  47.         next if ($nom ~~ /^$/);
  48.    }
  49.    if ($tag ~~ /^etiquette\d+$/) {
  50.      $etiquette = ($_->content_list())[0];
  51. next if (ref($etiquette));
  52.         $etiquette =~ s/^\s+|\s+$//g;
  53.         next if ($etiquette ~~ /^$/);
  54.      $h2{$etiquette}= $nom;
  55.    }
  56. }
  57. }
  58. $tree->delete;
  59. open my $fh,  "<:utf8", '/home/hp/Bureau/out33.txt';
  60. open my $fh1, ">:utf8", '/home/hp/Bureau/resultatML.txt';
  61. my $linenum = 0;
  62. my (@bloc, @words);
  63. foreach(<$fh> ) {
  64. unless ($linenum++ or not /^\x{feff}/) {
  65.    s/^\x{feff}// ;
  66. }
  67. if (/^\s*$/) {
  68.    if (0+@bloc) {
  69. print $fh1 join(" + ", @bloc), "\n";
  70.      @bloc = ();
  71.    }
  72. }
  73. else {
  74.    s/^\s+|\s+$//g;
  75.    @words = split /\s+/;
  76.    if (defined($h1{$words[0]}) and defined($h2{$h1{$words[0]}})) {
  77. unless  ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {
  78.        push @bloc, $h2{$h1{$words[0]}};
  79.    }
  80.    }
  81.    else {
  82.       push @bloc, "???";
  83.    }
  84. }
  85. }
  86. if (0+@bloc) {
  87. print $fh1 join(" + ", @bloc), "\n";
  88. }
  89. close $fh;


 
avec out33.txt  
أَيْ confirmation  
تْفَضَّلْ politesse  
خُويَا nomination  
. Point  
مْعَ etiq  
وَقْتَاشْ outil question demande horaire  
بِاللهْ demande  
التْرَانْ marq train  
يِمْشِي marq depart  
؟ Point_Interrogation  
fic2.xml
 
 
<mot>
<synonyme>!</synonyme>
<etiquette>Point Exclamation</etiquette>
</mot>
 
<mot>
<synonyme> . </synonyme>
<etiquette>point</etiquette>
</mot>
 
<mot>
<synonyme>؟</synonyme>
<etiquette>Point_Interrogation</etiquette>
</mot>
 
<mot>
<synonyme>أَيْ</synonyme>
<etiquette>confirmation</etiquette>
</mot>
 
<mot>
<synonyme>تْفَضَّلْ </synonyme>
<etiquette>politesse</etiquette>
</mot>
 
et fic3.xml
<classe>
<nom> Depart </nom>
<etiquette1>  marq depart</etiquette1>
</classe>
 
<classe>
<nom>Ponctuation  </nom>
<etiquette1>  Point_Exclamation  </etiquette1>
<etiquette2>  point  </etiquette2>
<etiquette3>  Point_Interrogation</etiquette3>
</classe>  
...
 
la sortie  de mon programme est la suivante :  
Confirmation + Politesse + Nomination + Vide + Question + Demande + Train + Depart
 
comment puis je modifier le code pour avoir comme resultat :  
Confirmation + Politesse + Nomination  
Vide + Question + Demande + Train + Depart
 
Merci d'avance

mood
Publicité
Posté le 09-10-2013 à 23:43:26  profilanswer
 

n°2206168
gilou
Modérateur
Modzilla
Posté le 10-10-2013 à 01:31:36  profilanswer
 

Il vient d'ou ce Vide?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2206180
rim_enis
j'aime ENIS
Posté le 10-10-2013 à 08:39:40  profilanswer
 

gilou a écrit :

Il vient d'ou ce Vide?
A+,


Bonjour ,  
En fait dans la sortie , je veux qu'a chaque fois il trouve un signe de ponctuation il fait un retour a la ligne :
 
avec out33.txt  
أَيْ confirmation  
تْفَضَّلْ politesse  
خُويَا nomination  
. Point  
مْعَ etiq  
وَقْتَاشْ outil question demande horaire  
بِاللهْ demande  
التْرَانْ marq train  
يِمْشِي marq depart  
؟ Point_Interrogation
 
donc le resultat sera donc :  
 

Confirmation + Politesse + Nomination  
 Vide + Question + Demande + Train + Depart
 

au lieu de  
Confirmation + Politesse + Nomination + Vide + Question + Demande + Train + Depart
 

n°2206203
gilou
Modérateur
Modzilla
Posté le 10-10-2013 à 11:37:49  profilanswer
 

Donc clairement il va falloir remplacer le  
unless  ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {
       push @bloc, $h2{$h1{$words[0]}};
   }
par un  
if ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {
       push @bloc, "\n";
}  
else {
       push @bloc, $h2{$h1{$words[0]}};
}
je pense.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2206208
rim_enis
j'aime ENIS
Posté le 10-10-2013 à 11:53:54  profilanswer
 

bonjour,  
oui cous avez raison sauf que il ya un signe "+" de plus à la fin et au début de chaque ligne
Confirmation + Politesse + Nomination +  
 + Vide + Question + Demande + Train + Depart +  
 + ??? + Politesse + Nomination +  
 
??? + Politesse + Nomination +


Message édité par rim_enis le 10-10-2013 à 11:54:44
n°2206222
gilou
Modérateur
Modzilla
Posté le 10-10-2013 à 13:23:45  profilanswer
 

En effet. Dans ce cas la, ceci devrait faire l'affaire:
if ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {  
       my $truc = pop @bloc;
       $truc = $truc . "\n";
       push @bloc, $truc;  
}  
.....
 
Et il faudra éventuellement tenir compte du cas ou @bloc est vide (tester si ça passe ainsi ou s'il faut un test spécifique et du code pour en tenir compte).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2206228
rim_enis
j'aime ENIS
Posté le 10-10-2013 à 13:50:07  profilanswer
 

j'ai testé juste le signe "+" à la fin sont enlevé , ainsi il ya des lgnes vide
 
voici le resultat :
 
Confirmation + Politesse + Nomination
 + Vide + Question + Demande + Train + Depart
 
 + ??? + ??? + ??? + ??? + Vide + Question + ??? + ??? + ???
 
 + ??? + Vide + Vide + ??? + ??? + ??? + ??? + ???
 + ??? + ??? + Vide + ??? + ??? + ??? + Demande + Tichet + ??? + ???
 + ??? + ??? + ??? + ???
 + ??? + ???
 + ??? + ??? + ??? + Question + Depart + ???

n°2206249
gilou
Modérateur
Modzilla
Posté le 10-10-2013 à 14:49:03  profilanswer
 

Ah, j'avais pas fait attention au fait que vous ne vouliez pas de + en début de ligne.
Dans ce cas la le plus simple est de positionner un flag $punc pour savoir qu'on a rencontré de la ponctuation:
 
     @words = split /\s+/;
     my $punct = 0;
          .....................
     if ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {  
         $punct = 1;
    }  
    else {  
           my $truc;
           if ($punct) {
               $truc = pop @bloc;  
               $truc = $truc . "\n". $h2{$h1{$words[0]}};  
               $punct = 0;  
           }
           else {
               $truc = $h2{$h1{$words[0]}};  
           }
           push @bloc, $truc;  
    }  
 
Bon, c'est du code pas testé, mais ça donne l'idée.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2206315
rim_enis
j'aime ENIS
Posté le 10-10-2013 à 20:12:07  profilanswer
 

le problème est resolu, mais y'a t'il un moyen d'eliminer les lignes vide ds la sortie

n°2206329
gilou
Modérateur
Modzilla
Posté le 10-10-2013 à 21:12:08  profilanswer
 

Je ferais
    chomp;
    s/^\s+|\s+$//g;
   @words = split /\s+/;
    ...
et ça réglera peut être le problème.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 10-10-2013 à 21:12:08  profilanswer
 

n°2206344
rim_enis
j'aime ENIS
Posté le 10-10-2013 à 22:00:22  profilanswer
 

Non il reste encore des ligne vide mme avec chomp

n°2206358
gilou
Modérateur
Modzilla
Posté le 10-10-2013 à 23:54:48  profilanswer
 

Je ne peux pas vous en dire plus, les fichiers xml que vous me donnez en exemple, et en particulier fic3.xml,  ne sont pas avec assez de données pour que je puisse faire des tests utiles.
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

  perl + xml

 

Sujets relatifs
[Perl] Utilisation correcte de timeout_callPréprod/Prod, cpan, activestate, intégration librairies
[perl] process defunct avec fork et exec[Perl] Eviter les commandes system
Commande cp dans un script PERL[Résolu][Perl]Regrouper, compter et additionner
installation activate perl version 5.16 sous linuxscript perl
[Résolu][Perl] Découper un fichier en plusieurs et optimisationFaire échap en expect
Plus de sujets relatifs à : perl + xml


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