certain conditions ne menacant

certain conditions ne menacant - Perl - Programmation

Marsh Posté le 08-12-2015 à 13:33:43    

Salut a tous

 

j'ai un code traite le fichier de depart (src_sys.xml) et me renvoit les noms 'name'(attr_name) sur la pemiere ligne de mon fichier de sortie tout en splitant le nom du fichier de depart.(ceci dans le premier Twig)

 

ensuite il va et traite les fichiers restant dans le second Twig. Pour ce fait il cherche les valeurs 'value' (attr_value) correspondant a chaque 'name':

 

-Dans le cas ou il n'existe pas dans le fichier entrain d'etre traite il ecrit en desous du 'name' correspondant 'fault'.

 

-Dans le cas ou un fichier-xml qui est entrain d'etre traite possede plus de 'name' que le fichier de depart (src_sys.xml) ignorer le 'name' et continue.

 

-Dans le cas ou un fichier-xml qui est entrain d'etre traite possede moin de 'name' que le fichier de depart (src_sys.xml) ecrire en desous du 'name' correspondant 'missing'

 

jusqu'ici mon code travaille un peu et mais j'ai du souci sur 2 points:

 

-par moment quand 'value' n'existe pas au lieu d'ecire 'fault' comme mensionne dans le code il ecrit '0'

 

-Et maintenant au niveau de 'missing' cela m'echappe aussi.

 

je ne sais pas si quelqu'un ici pourrai me venir en aide. Merci bien d'avance.

 
Code :
  1. #!/usr/local/bin/perl -w                       
  2. use strict;
  3. use warnings;
  4. use XML::Twig;
  5. use Text::CSV;
  6. use POSIX qw(strftime); 
  7. use autodie; 
  8. use File::Basename;
  9. my $file1 = shift @ARGV;     
  10. my @files = glob( '../InputData/*.xml');     
  11. @files = grep { $_ ne $file1 } @files if defined $file1; 
  12. $file1 = basename '..\InputData\DEFAULT\src_sys.xml';
  13. my $date_1 = strftime "%Y%m%d %H:%M:%S", localtime;
  14. my $FileResult = '../CSV/DATA.csv';
  15. open( my $Fhhtml, '>', $FileResult ); 
  16. print $Fhhtml $date_1, "\n";
  17. my $twig1= XML::Twig->new(   
  18.         twig_handlers => {   
  19.                 'Par' => sub { 
  20.                         my $attr_name = $_->{'att'}->{'name'};
  21.                         print $Fhhtml $attr_name . ", ";   
  22.                 },
  23.         },
  24. );
  25. print $Fhhtml( (split('_', $file1,2))[0] . ', ' ); 
  26. $twig1->parsefile($file1 = '..\InputData\DEFAULT\src_sys.xml');   
  27. for my $file (@files) {
  28.     my $twig1 = XML::Twig->new(
  29.         twig_handlers => {
  30.             'Par' => sub {
  31.                 my $attr_value = $_->{'att'}->{'value'} // 'fault'; 
  32.                 unless (defined $_->{att}{name}) {
  33.                 $attr_value = "missing"
  34.                 }
  35.                 print $Fhhtml $attr_value . ", ";
  36.             },
  37.         },
  38.     );
  39.     my $result = (split( '_', "\n$file", 2 ) )[0] . ', ';
  40.     $result =~ s/..\/InputData\///g;
  41.     print $Fhhtml($result);
  42.     $twig1->parsefile($file);                 
  43. }
  44. close $Fhhtml;
 
Code :
  1. _________________src_sys______________
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <Profile origin="get" version="2.0" date="2013-07-021:49:13Z">
  4.   <Par name="cost" value="0">
  5.    <Target class="inter" inst="en0"/>
  6.   </Par>
  7.   <Par name="mic" value="0">
  8.    <Target class="inter" inst="en1"/>
  9.   </Par>
  10.   <Par name="mor" value="0">
  11.    <Target class="inter" inst="en2"/>
  12.   </Par>
  13.   <Par name="cost" value="0">
  14.    <Target class="inter" inst="lo0"/>
  15.   </Par>
  16.   <Par name="actived" value="0">
  17.    <Target class="inter" inst="en0"/>
  18.   </Par>
  19.   <Par name="edgd" value="0">
  20.    <Target class="inter" inst="en1"/>
  21.   </Par>
  22.   <Par name="activ" value="0">
  23.    <Target class="inter" inst="en2"/>
  24.   </Par>
  25. </Profile>
  26. _________________ABO________________
  27. <?xml version="1.0" encoding="UTF-8"?>
  28. <Profile origin="get" version="2.0" date="2013-07-021:49:13Z">
  29.   <Par name="cost" value="0">
  30.    <Target class="inter" inst="en0"/>
  31.   </Par>
  32.   <Par name="mic">
  33.    <Target class="inter" inst="en1"/>
  34.   </Par>
  35.   <Par name="mor" value="ce">
  36.    <Target class="inter" inst="en2"/>
  37.   </Par>
  38.   <Par name="cost" value="A0">
  39.    <Target class="inter" inst="lo0"/>
  40.   </Par>
  41.   <Par name="actived" value="10">
  42.    <Target class="inter" inst="en0"/>
  43.   </Par>
  44.   <Par name="edgd" value="out">
  45.    <Target class="inter" inst="en1"/>
  46.   </Par>
  47.   <Par name="activ">
  48.    <Target class="inter" inst="en2"/>
  49.   </Par>
  50. </Profile>
  51. __________________ABI_________________
  52. <?xml version="1.0" encoding="UTF-8"?>
  53. <Profile origin="get" version="2.0" date="2013-07-021:49:13Z">
  54.   <Par name="cost" value="1">
  55.    <Target class="inter" inst="en0"/>
  56.   </Par>
  57.   <Par name="mic" value="A">
  58.    <Target class="inter" inst="en1"/>
  59.   </Par>
  60.   <Par name="mor" value="B">
  61.    <Target class="inter" inst="en2"/>
  62.   </Par>
  63.   <Par name="cost" value="C">
  64.    <Target class="inter" inst="lo0"/>
  65.   </Par>
  66.   <Par name="actived">
  67.    <Target class="inter" inst="en0"/>
  68.   </Par>
  69.   <Par name="mac" value="E">
  70.    <Target class="inter" inst="en1"/>
  71.   </Par>
  72.   <Par name="edgd" value="F">
  73.    <Target class="inter" inst="en1"/>
  74.   </Par>
  75.   <Par name="activ" value="G">
  76.    <Target class="inter" inst="en2"/>
  77.   </Par>
  78. </Profile>
  79. _________________ABA_________________
  80. <?xml version="1.0" encoding="UTF-8"?>
  81. <Profile origin="get" version="2.0" date="2013-07-021:49:13Z">
  82.   <Par name="cost" value="40">
  83.    <Target class="inter" inst="en0"/>
  84.   </Par>
  85.   <Par name="mic" value="ae">
  86.    <Target class="inter" inst="en1"/>
  87.   </Par>
  88.   <Par name="mor" value="0">
  89.    <Target class="inter" inst="en2"/>
  90.   </Par>
  91.   <Par name="cost">
  92.    <Target class="inter" inst="lo0"/>
  93.   </Par>
  94.   <Par name="actived" value="da">
  95.    <Target class="inter" inst="en0"/>
  96.   </Par>
  97.   <Par name="activ" value="ka">
  98.    <Target class="inter" inst="en2"/>
  99.   </Par>
  100. </Profile>
 
Code :
  1. _____________________output__________________________
  2. src cost  mic    mor   cost   actived   edgd     activ
  3. ABO  0    fault  ce     A0      10      out      fault
  4. ABI  1    A      B      C      fault    F        G
  5. ABA  40   ae     0      fault   da      missing  ka


Message édité par Henri772 le 08-12-2015 à 17:05:25
Reply

Marsh Posté le 08-12-2015 à 13:33:43   

Reply

Marsh Posté le 08-12-2015 à 15:12:12    

Déjà, avec Par dans les xml et Parameter dans le twig, ça doit marcher du tonnerre :sarcastic:  
 
A+,


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

Marsh Posté le 08-12-2015 à 17:04:21    

gilou a écrit :

Déjà, avec Par dans les xml et Parameter dans le twig, ça doit marcher du tonnerre :sarcastic:  
 
A+,


 
salut Guiou c'est un probleme de nomenclture au fait des le depart c'etait paramater, j'ai change et oublie de le change en publiant cela ici
merci bien de la remarque

Reply

Marsh Posté le 08-12-2015 à 17:32:04    

Un exemple de solution qui marche sur tes données

Code :
  1. #!/usr/local/bin/perl
  2. use Modern::Perl;
  3. use autodie;
  4. use XML::Twig;
  5. use Data::Dumper;
  6. use File::Basename;
  7.  
  8. # parametrage externe
  9. my $arg_file = shift @ARGV;
  10. my $sys_file = '..\InputData\DEFAULT\src_sys.xml';
  11. my @files = glob('..\InputData\*.xml');
  12. @files = grep { $_ ne $arg_file } @files if defined $arg_file;
  13. my $result_file = '..\CSV\DATA.csv';
  14.  
  15. # On recupere le liste des noms d'attributs
  16. my @sys_names;
  17. my $sys_twig = XML::Twig->new( twig_handlers => { 'Par' => sub { push @sys_names, $_->{'att'}->{'name'}; }});
  18. $sys_twig->parsefile($sys_file);
  19.  
  20. # On recupere le liste des noms d'attributs et la liste de leur valeurs pour chaque fichier
  21. # Et on colle le tout dans un hash indexé par les noms de fichiers
  22. my %hash;
  23. foreach my $file (@files) {
  24.  $hash{$file}{'att_names'} = [];
  25.  $hash{$file}{'att_values'} = [];
  26.  my $file_twig = XML::Twig->new( twig_handlers => { 'Par' => sub { push @{$hash{$file}{'att_names'}},  $_->{'att'}->{'name'};
  27.                                             push @{$hash{$file}{'att_values'}}, ($_->{'att'}->{'value'} // 'fault'); }});
  28.  $file_twig->parsefile($file);
  29. }
  30.  
  31. # pour économiser le chargement d'un module
  32. sub timestamp {
  33.  my $i;
  34.  return sprintf "%04d%02d%02d %02d:%02d:%02d", map {$_ + (1900,1,0,0,0,0)[$i++]} reverse ((localtime)[0..5]);
  35. }
  36.  
  37. # On a tout, on va pouvoir traiter
  38. open my $fhout, ">", $result_file;
  39. print $fhout timestamp(), "\n";
  40. print $fhout ((split(/_/, basename($sys_file)))[0]), "\t", join("\t", @sys_names), "\n";
  41.  
  42. foreach my $file (@files) {
  43.  print $fhout  ((split(/\./, basename($file)))[0]);
  44.  my $j = 0;
  45.  foreach my $i (0..$#sys_names) {
  46.    if ($hash{$file}{'att_names'}->[$j] and  $hash{$file}{'att_names'}->[$j] eq $sys_names[$i]) {
  47.      print $fhout "\t", $hash{$file}{'att_values'}->[$j];
  48.    }
  49.    # une heuristique, il y a peut être mieux
  50.    else {
  51.      my $k = $j+1;
  52.      while ($hash{$file}{'att_names'}->[$k] and  $hash{$file}{'att_names'}->[$k] ne $sys_names[$i]) {
  53.         ++$k;
  54.      }
  55.      if ($hash{$file}{'att_names'}->[$k]) {
  56.         $j = $k;
  57.         print $fhout "\t", $hash{$file}{'att_values'}->[$j];
  58.      }
  59.      else {
  60.         print $fhout "\t", "missing";
  61.         --$j;
  62.      }
  63.    }
  64.    ++$j;
  65.  }
  66.  print $fhout "\n";
  67. }
  68. close $fhout;


L'heuristique bête est:
Si j'en suis a traiter l'attribut A et que je trouve un attribut B la ou j'attendais le A, alors je cherche plus loin s'il y a un attribut A.
Si oui, je saute les attributs intermédiaires.
Sinon, je mets comme valeur 'missing' et je passe à l'attribut à traiter suivant.
 
A+,


Message édité par gilou le 08-12-2015 à 17:42:35

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

Marsh Posté le 08-12-2015 à 22:24:32    

Salut Gilou,
Une fois de plus merci bien de ta proposition mais j'ai un souci avec ce code quand il traite les fichiers-xml il ya encore sur le fichier de sortie des champs vide je pense qu'il a un peu le meme probleme que le mien.
et ensuite aulieu de spliter il rajoute au nom du fichier 'base', bon cela je peus le regler.  
et aussi je ne sais pas comment le caractere -> apparait a chaque fois qu'il ecrit un 'name' ou un 'value' dans le fichier de sortie.

Reply

Marsh Posté le 08-12-2015 à 23:46:45    

Moi, avec les 4 fichiers de données que tu as fourni, j'obtiens ceci dans Data.csv:

20151208 17:27:09
src    cost    mic     mor     cost    actived edgd    activ
ABA    40      ae      0       fault   da      missing ka
ABI    1       A       B       C       fault   F       G
ABO    0       fault   ce      A0      10      out     fault

[:souk]  
 
A+,


Message édité par gilou le 08-12-2015 à 23:58:08

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

Marsh Posté le 09-12-2015 à 10:18:43    

Merci bien mais je ne comprend pas pourquoi ca ne marche pas de mon cote, c'est vraiment etrange

Reply

Marsh Posté le 09-12-2015 à 10:21:24    

j'aimerai bien te faire pavenir certain fichiers originaux pour que tu voye aussi ce que me revoit le code j'ai deja essaye de faire des changement malheureusement ca na marche pas.

Reply

Marsh Posté le 09-12-2015 à 12:42:58    

salut Gilou voila un apercu de ce que je recois


Message édité par Henri772 le 20-12-2015 à 16:09:56
Reply

Marsh Posté le 09-12-2015 à 15:29:09    

Sur une simple image, je peux pas aider des masses.:D
 
A+,


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

Marsh Posté le 09-12-2015 à 15:29:09   

Reply

Marsh Posté le 09-12-2015 à 15:47:52    

ok voila certain de ces fichiers.xml que je t'envoi car j'ai essaye la ca me depasse .
tu peus change Par avec Parameter  
et src_sys par default_value.xml
 


Message édité par Henri772 le 20-12-2015 à 16:09:12
Reply

Marsh Posté le 09-12-2015 à 15:58:49    

Je comptais te suggérer la solution zippyshare, mais avec des fichiers dans un zip crypté dont tu m'aurais envoyé la clé en MP...
Je vais y jeter un oeil.
 
A+,


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

Marsh Posté le 09-12-2015 à 16:30:16    

Donc déjà pour que cela fonctionne, il y a un remplacements à effectuer:
 
my $sys_file = '..\InputData\DEFAULT\default_sysvalue.xml';
 
et pour le log,
# On a tout, on va pouvoir traiter
...
print $fhout ((split(/_/, basename($sys_file)))[0]), "\t", join("\t", @sys_names), "\n";
foreach my $file (@files) {
  print $fhout  (split(/_/, ((split(/\./, basename($file)))[0])))[0];
 
Et chez moi, ça fournit un DATA.csv (énorme, que je vais tacher de regarder un peu plus en détail)
Note: pour que ça marche, mon script est bien sur dans un répertoire Perl, qui est au même niveau que InputData (ie InputData, CSV et Perl sont dans un même répertoire).
 
A+,


Message édité par gilou le 09-12-2015 à 16:31:41

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

Marsh Posté le 09-12-2015 à 17:09:50    

salut Gilou je comprend bien ce que tu veus dire par la. Car j'ai l'impression que le code fonctionne un peu comme le mien car par moment quand 'value' n'existe pas au lieu d'ecrire 'fault' il n'ecrit rien et ensuite avec le cas 'missing' on ne devait pas avoir des valeurs 'value' apres le dernier parametre 'name' .
 
A+

Message cité 1 fois
Message édité par Henri772 le 20-12-2015 à 16:10:20
Reply

Marsh Posté le 09-12-2015 à 17:49:26    

Henri772 a écrit :

salut Gilou je comprend bien ce que tu veus dire par la. Car j'ai l'impression que le code fonctionne un peu comme le mien car par moment quand 'value' n'existe pas au lieu d'ecrire 'fault' il n'ecrit rien et ensuite avec le cas 'missing' on ne devait pas avoir des valeurs 'value' apres le dernier parametre 'name' .
http://www.bilder-upload.eu/show.p [...] 678423.png
http://www.bilder-upload.eu/show.p [...] 678447.png
A+

Mais la, c'est excel qui arrive pas a lire le bouzin en CSV et rien d'autre:
Tu  
1) imprimes pas le timestamp
2) remplaces les \t séparateurs de champ par des ;
3) ouvres avec un excel récent (2013 par exemple; sur ma machine, ou je n'ai que excel 2003, ça passait pas, mais j'ai été tester sur une bécane plus récente et c'est passé sans pb)
Et tu verras qu'il y a rien qui dépasse, toutes les lignes ont la même longueur.
Dans la feuille, le seul truc qui m'inquiétait, c'est que je voyais des valeurs à vide, mais en fait, c'est que la valeur par défaut et les valeurs non par défaut étaient une chaine vide.
 
A+,


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

Marsh Posté le 09-12-2015 à 17:53:54    

Henri772 a écrit :


 
Merci bien j'aivais deja signifie un truc de ce genre a mon Maitre de stage que les fichiers me semblait pas identique et que par concequent une comparaison serait impossible. es ce qu'il serait possible d'ajouter le cas suivant : d'affecter l'instance au name lorsque les names son identique du genre  

Code :
  1. <Parameter name="max_vg_pbufs" value="524288" applyType="nextboot" reboot="true"><Target class="vg" instance="vg6dbzt04"/></Parameter>


max_vg_pbufs_inst_vg6dbzt04
              524288
et ainsi de suite. Mais je sens que il sera maintenant difficile de retrouver le 'values' correspondante.
s'il te plait rend moi un service efface ses donnes il ne doivent malheureusement pas etres publie. Merci d'avance.
A+

Ben ça a pas grand sens quand les instances sont différentes et c'est problématiques: on ne saurait lesquelles sont communes au défaut et à un autre fichier qu'après avoir parsé tous les autres fichiers.
 
A+,


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

Marsh Posté le 09-12-2015 à 17:55:38    

ok, je vais essaye cela voir j'ai le 2013 sur une autre Machine  au fait le firme travaille avec openOffice comme tu l'a remarque

Reply

Marsh Posté le 09-12-2015 à 18:21:34    

ca essaye un peu d'aller mais comme tu l'as aussi remarque il ya des vides et aussi il ya des 'missing' ecrit plusieurs fois dans un champ regarde l'image suivante  


Message édité par Henri772 le 20-12-2015 à 16:12:17
Reply

Marsh Posté le 09-12-2015 à 18:28:03    

je pense que le probleme ne se situe pas vraiment au niveau du fait qu'il ait les memes noms regarde ce que me livrait mon code  
il on tous les memes noms 'file' mais il effectue bien le trie

Message cité 1 fois
Message édité par Henri772 le 20-12-2015 à 16:12:33
Reply

Marsh Posté le 09-12-2015 à 20:44:51    

Henri772 a écrit :

je pense que le probleme ne se situe pas vraiment au niveau du fait qu'il ait les memes noms regarde ce que me livrait mon code  
il on tous les memes noms 'file' mais il effectue bien le trie
http://www.bilder-upload.eu/show.p [...] 683023.png

Oui, parce que la, le nom d'instance du target est discriminant et se retrouve dans les fichiers de données, mais ce n'est pas le cas partout.
 
A+,


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

Marsh Posté le 09-12-2015 à 23:12:39    

salut j'ai trouve pourquoi il ya des champs vide si tu regarde bien dans l'un des fichiers tu trouvera des valeuer ecrit ainsi value="" sachant que tout le valeurs sont ecritent entre les "" donc  quand le code traite un fichier donc la value="" il ne trouve rien entre "" et il renvoi le vide. dans le cas ou il n'ya pas de value declare il revoi correctement 'fault' maintenant pourquoi il ecrit missing plusieurs fois dans un meme champs et pourquoi le resultat de notre fichier csv na pas une forme rectangülare und carree a ce niveau je m'explique il faudrait bien qu'aucune 'value' soit ecrit dans le fichier lorsque le 'name' n'existe pas. un peu comme sur cette image  
 
A+


Message édité par Henri772 le 20-12-2015 à 16:11:44
Reply

Marsh Posté le 09-12-2015 à 23:31:48    

> si tu regarde bien dans l'un des fichiers tu trouvera des valeuer ecrit ainsi value=""
C'est ce que je t'ai signalé il y a un bail. Mais dans mon code, une valeur "" donne un champ avec "" en sortie.
 
A+,


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

Marsh Posté le 09-12-2015 à 23:39:21    

Tiens donc, voila un code propre qui fait le boulot et que tu pourras modifier si le format de sortie ne te convient pas [pas sur que tu veuilles la ligne avec les valeurs par défaut, mais ça me semblait logique]. Le parsing est identique pour le fichier par défaut et ceux pour les données, donc ça devrait faciliter la compréhension.
Testé et vérifié sur tes données.
 

Code :
  1. #!/usr/local/bin/perl
  2. use Modern::Perl;
  3. use autodie;
  4. use XML::Twig;
  5. use File::Basename;
  6. use Data::Dumper;
  7.  
  8. # parametrage externe
  9. my $arg_file = shift @ARGV;
  10. my $default_file = '..\InputData\DEFAULT\default_sysvalue.xml';
  11. my @files = glob('..\InputData\*.xml');
  12. @files = grep { $_ ne $arg_file } @files if defined $arg_file;
  13. my $result_file = '..\CSV\DATA.csv';
  14.  
  15. # pour économiser le chargement d'un module
  16. sub timestamp {
  17.  my $i;
  18.  return sprintf "%04d%02d%02d %02d:%02d:%02d", map {$_ + (1900,1,0,0,0,0)[$i++]} reverse ((localtime)[0..5]);
  19. }
  20.  
  21. # caractère séparateur pour l'criture dans le CSV résultat
  22. my $sep_char = ";";
  23.  
  24. # On crée un identifiant unique pour ne pas clasher avec les noms d'attributs ou de fichier
  25. # pour la liste des noms de catalogues et la liste des noms d'attributs dans un catalogue
  26. my $uuid = '3F56E1C5-D6B9-1014-9A88-CDB8776B8231';
  27. # Obtenu avec un générateur d'uuid
  28. # Ou tout autre truc plus simple dont tu es sur que ça va jamais clasher avec les noms dans tes fichiers
  29.  
  30. # On traite d'abord $default_file
  31. my %defaults;  # hash qui va contenir toute l'information utile parsée
  32. $defaults{$uuid} = [];
  33. my $default_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$defaults{$uuid}}[-1];
  34.                                        my $name = $_->{'att'}->{'name'};
  35.                                        # formatage spécial si on a un Target avec instance
  36.                                        my $target = $_->first_child('Target');
  37.                                        if ($target) {
  38.                                          $name = $target->{'att'}->{'instance'}. '--' . $name ;
  39.                                        }
  40.                                        push @{$defaults{$cat_id}{$uuid}}, $name;
  41.                                        # si on veut traiter le cas ou une valeur est égale à ""
  42.                                        # il faut modifier ici
  43.                                        $defaults{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';}},
  44.                    start_tag_handlers => { 'Catalog' => sub { my $cat_id = $_->{'att'}->{'id'};
  45.                                           push @{$defaults{$uuid}}, $cat_id;
  46.                                           $defaults{$cat_id}{$uuid} = [];} });
  47. $default_twig->parsefile($default_file);
  48.  
  49. # structure du hash après parsing:
  50. # $defaults{$uuid} est la liste des (id des) catalogues rencontrés
  51. # et pour chaque catalogue $cat_id de cette liste
  52. # $defaults{$cat_id}{$uuid} est la liste des (noms des) paramètres rencontrés dans le catalogue
  53. # noter que s'il y a une target, le non est préfixé par l'instance du target
  54. # et pour chaque paramètre $name de cette liste
  55. # $defaults{$cat_id}{$name} est la valeur du paramètre (ou bien fault)
  56. # faire ici un print Dumper(%defaults) si on veut visualiser la structure à la console
  57.  
  58. # On écrit en sortie ce qui a ét lu dans $default_file
  59. open my $fhout, ">", $result_file;
  60. # On écrit un timestamp en première ligne
  61. print $fhout timestamp(), "\n";
  62. # On écrit le nom (début du) du fichier par défaut
  63. print $fhout ((split(/_/, basename($default_file)))[0]);
  64. # puis la liste des noms d'attributs
  65. foreach my $cat_id (@{$defaults{$uuid}}) {
  66.  foreach my $name (@{$defaults{$cat_id}{$uuid}}) {
  67.    print $fhout $sep_char, $name;
  68.  }
  69. }
  70. print $fhout "\n";
  71. # puis sur une nouvelle ligne, default, pour signifier la ligne des valeurs par défaut
  72. print $fhout "default";
  73. # puis les valeurs par défaut
  74. foreach my $cat_id (@{$defaults{$uuid}}) {
  75.  foreach my $name (@{$defaults{$cat_id}{$uuid}}) {
  76.    print $fhout $sep_char, $defaults{$cat_id}{$name};
  77.  }
  78. }
  79. print $fhout "\n";
  80.  
  81. # On traite maintenant les fichiers de données
  82. foreach my $file (@files) {
  83.  my %datas;  # hash qui va contenir toute l'information utile parsée
  84.  $datas{$uuid} = [];
  85.  my $datas_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$datas{$uuid}}[-1];
  86.                                        my $name = $_->{'att'}->{'name'};
  87.                                        # formatage spécial si on a un Target avec instance
  88.                                        my $target = $_->first_child('Target');
  89.                                        if ($target) {
  90.                                          $name = $target->{'att'}->{'instance'}. '--' . $name ;
  91.                                        }
  92.                                        push @{$datas{$cat_id}{$uuid}}, $name;
  93.                                        # si on veut traiter le cas ou une valeur est égale à ""
  94.                                        # il faut modifier ici
  95.                                        $datas{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';}},
  96.                    start_tag_handlers => { 'Catalog' => sub { my $cat_id = $_->{'att'}->{'id'};
  97.                                           push @{$datas{$uuid}}, $cat_id;
  98.                                           $datas{$cat_id}{$uuid} = [];} });
  99.  $datas_twig->parsefile($file);
  100.  
  101.  # et on écrit ce qui a été trouvé
  102.  # d'abord le nom du fichier
  103.  print $fhout  (split(/_/, ((split(/\./, basename($file)))[0])))[0];
  104.  # puis la liste des valeurs
  105.  foreach my $cat_id (@{$defaults{$uuid}}) {
  106.    foreach my $name (@{$defaults{$cat_id}{$uuid}}) {
  107.      print $fhout $sep_char, ($datas{$cat_id}{$name} // 'missing');
  108.    }
  109.  }
  110.  print $fhout "\n";
  111. }
  112. close $fhout;


Bon, comme le forum et mon éditeur de texte n'ont pas la même notion de ce qu'est une tabulation, le formatage va sauter, mais j'ai la flemme de le refaire à la mimine.
EDIT: ah ben non, pour une fois, le formatage est resté à peu près bon.
A+,


Message édité par gilou le 09-12-2015 à 23:40:31

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

Marsh Posté le 09-12-2015 à 23:54:14    

Un peu de détails

Code :
  1. my %defaults;  # hash qui va contenir toute l'information utile parsée
  2. $defaults{$uuid} = [];
  3. my $default_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$defaults{$uuid}}[-1];
  4. ......
  5.                   start_tag_handlers => { 'Catalog' => sub { my $cat_id = $_->{'att'}->{'id'};
  6.                                          push @{$defaults{$uuid}}, $cat_id;
  7.                                          $defaults{$cat_id}{$uuid} = [];} });


 
my %defaults; Je crée un hash
$defaults{$uuid} = []; Je crée une entrée pour la liste des catalogues: $defaults{$uuid} est (une référence à) une liste vide
Quand je trouve un nouveau catalogue
push @{$defaults{$uuid}}, $cat_id; Je mets son id (bref son nom) dans la liste des catalogues
$defaults{$cat_id}{$uuid} = []; puis je crée une entrée du hash global pour ce nom de catalogue, et pour cette entrée, je crée une sous entrée pour la liste des paramètres que je vais rencontrer dans le catalogue (et qui est donc créé comme vide au départ).  
 

Code :
  1. my $datas_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$datas{$uuid}}[-1];
  2.                                       my $name = $_->{'att'}->{'name'};
  3.                                      
  4.                                       push @{$datas{$cat_id}{$uuid}}, $name;
  5.                                      
  6.                                       $datas{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';}},


Quand j'ai fini de parser un parametre
my $cat_id = @{$datas{$uuid}}[-1]; Je récupère le nom du catalogue courant, et  
push @{$datas{$cat_id}{$uuid}}, $name; je colle le nom du paramètre dans la liste des paramètres du catalogue courant
$datas{$cat_id}{$name} = $_->{'att'}->{'value'} et j'associe le nom et la valeur dans le catalogue courant
 
A+,


Message édité par gilou le 09-12-2015 à 23:56:20

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

Marsh Posté le 10-12-2015 à 03:31:09    

tres grand merci Gilou, ca fonctionne bien mais il ya quelque chose que je vais signale si c'est trop te demande, pas de probleme je reflechirait comment le resoudre a savoir comment supprime les 'value' qui n'on pas de 'name' correspondant, tout ce marque en bleu clair ne me sert a rien.
 
Merci bien des explications
A+


Message édité par Henri772 le 20-12-2015 à 16:11:18
Reply

Marsh Posté le 10-12-2015 à 12:16:17    

C'est bizarre, chez moi, je n'ai aucun champ correspondant à un name sans valeur et tout est au clair dans excel:
voir ici dans l'image le dernier champ, il n'y a rien après.
Ça veut donc dire que tu as des trucs de la forme  
<Parameter name="" value="fast_fail">
dans ton fichier par défaut?
 
Bon, c'est pas compliqué, tes names n'ont certainement pas "aucune valeur", ils ont une valeur réduite à la chaine vide "".
Donc ça va se faire à ce niveau la:

Code :
  1. my $default_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$defaults{$uuid}}[-1];
  2.                                       my $name = $_->{'att'}->{'name'};
  3.                                       # formatage spécial si on a un Target avec instance
  4.                                       my $target = $_->first_child('Target');
  5.                                       if ($target) {
  6.                                         $name = $target->{'att'}->{'instance'}. '--' . $name ;
  7.                                       }
  8.                                       push @{$defaults{$cat_id}{$uuid}}, $name;
  9.                                       # si on veut traiter le cas ou une valeur est égale à ""
  10.                                       # il faut modifier ici
  11.                                       $defaults{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';}},


Une fois que tu as le name:
  my $name = $_->{'att'}->{'name'};
Tu testes qu'il n'est pas vide avant de l'ajouter à la liste:
  if ($name ne "" ) {
      if ($target) {
         $name = $target->{'att'}->{'instance'}. '--' . $name ;
      }
      push @{$defaults{$cat_id}{$uuid}}, $name;
     # si on veut traiter le cas ou une valeur est égale à ""
     # il faut modifier ici
     $defaults{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';
  }
}},
et ça devrait rouler: comme on vire les paramètres sans nom, on vire du coup aussi leur valeurs.
Tu peux aussi reporter le même test dans le code de $datas_twig histoire d'avoir le même code pour les deux handlers (ça devrait pas influer sur ce qu'on obtient en sortie, mais autant avoir un code clair et homogène).
 
A+,

Message cité 1 fois
Message édité par gilou le 10-12-2015 à 12:21:26

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

Marsh Posté le 10-12-2015 à 13:49:52    

gilou a écrit :

C'est bizarre, chez moi, je n'ai aucun champ correspondant à un name sans valeur et tout est au clair dans excel:
voir ici dans l'image le dernier champ, il n'y a rien après.
Ça veut donc dire que tu as des trucs de la forme  
<Parameter name="" value="fast_fail">
dans ton fichier par défaut?
 
Bon, c'est pas compliqué, tes names n'ont certainement pas "aucune valeur", ils ont une valeur réduite à la chaine vide "".
Donc ça va se faire à ce niveau la:

Code :
  1. my $default_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$defaults{$uuid}}[-1];
  2.                                       my $name = $_->{'att'}->{'name'};
  3.                                       # formatage spécial si on a un Target avec instance
  4.                                       my $target = $_->first_child('Target');
  5.                                       if ($target) {
  6.                                         $name = $target->{'att'}->{'instance'}. '--' . $name ;
  7.                                       }
  8.                                       push @{$defaults{$cat_id}{$uuid}}, $name;
  9.                                       # si on veut traiter le cas ou une valeur est égale à ""
  10.                                       # il faut modifier ici
  11.                                       $defaults{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';}},


Une fois que tu as le name:
  my $name = $_->{'att'}->{'name'};
Tu testes qu'il n'est pas vide avant de l'ajouter à la liste:
  if ($name ne "" ) {
      if ($target) {
         $name = $target->{'att'}->{'instance'}. '--' . $name ;
      }
      push @{$defaults{$cat_id}{$uuid}}, $name;
     # si on veut traiter le cas ou une valeur est égale à ""
     # il faut modifier ici
     $defaults{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';
  }
}},
et ça devrait rouler: comme on vire les paramètres sans nom, on vire du coup aussi leur valeurs.
Tu peux aussi reporter le même test dans le code de $datas_twig histoire d'avoir le même code pour les deux handlers (ça devrait pas influer sur ce qu'on obtient en sortie, mais autant avoir un code clair et homogène).
 
A+,


 
c'est vraiment etrange ce que cela marche bien chez toi et chez moi ca ne deonne pas, regarde J'ai effectuer le changement comme tu me l'a conceille malheursement c'est toujours sans changement
 

Code :
  1. my $default_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$defaults{$uuid}}[-1];
  2.                                           my $name = $_->{'att'}->{'name'};
  3.                                           # formatage spécial si on a un Target avec instance
  4.                                            my $target = $_->first_child('Target');
  5.                                           if ($name ne "" ) {
  6.                                             if ($target) {
  7.                                             $name = $target->{'att'}->{'instance'}. '--' . $name ;
  8.                                           }
  9.                                           push @{$defaults{$cat_id}{$uuid}}, $name;
  10.                                           # si on veut traiter le cas ou une valeur est égale à ""
  11.                                           # il faut modifier ici
  12.                                           $defaults{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';}}},


 

Code :
  1. my $datas_twig = XML::Twig->new( twig_handlers => { 'Parameter' => sub { my $cat_id = @{$datas{$uuid}}[-1];
  2.                                           my $name = $_->{'att'}->{'name'};
  3.                                           # formatage spécial si on a un Target avec instance
  4.                                            my $target = $_->first_child('Target');
  5.                                           if ($name ne "" ) {
  6.                                              if ($target) {
  7.                                             $name = $target->{'att'}->{'instance'}. '--' . $name ;
  8.                                           }
  9.                                           push @{$datas{$cat_id}{$uuid}}, $name;
  10.                                           # si on veut traiter le cas ou une valeur est égale à ""
  11.                                           # il faut modifier ici
  12.                                           $datas{$cat_id}{$name} = $_->{'att'}->{'value'} // 'fault';}}},

Reply

Marsh Posté le 10-12-2015 à 14:35:31    

Vérifie alors que ça vient pas de ton excel (j'utilise excel 2013).
Sinon, je peux pas t'en dire plus vu que chez moi ça marche.
(mon perl est celui de Active State sur PC)
 
A+,


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

Marsh Posté le 10-12-2015 à 15:07:04    

Dit quelle perl- version est sur ton PC la j'ai la  v5.16.3
A+


Message édité par Henri772 le 10-12-2015 à 15:07:22
Reply

Marsh Posté le 10-12-2015 à 16:04:11    

Citation :

This is perl 5, version 20, subversion 2 (v5.20.2) built for MSWin32-x86-multi-thread-64int


 
Bref, la version courante (et à jour) de Active State. La v5.16, elle a plus de 3 ans.
 
A+,


Message édité par gilou le 10-12-2015 à 16:04:35

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

Marsh Posté le 10-12-2015 à 16:56:53    

je demande cette initialisation je ne comprend pas cela
 
my $uuid = '3F56E1C5-D6B9-1014-9A88-CDB8776B8231';

Reply

Marsh Posté le 10-12-2015 à 19:28:29    

C'est pour avoir un identifiant qui ne risque pas d'être trouvé comme un nom de catalogue ou un nom de paramètre (bref c'est un nom spécial pour coller la liste des catalogue, et pour chaque catalogue la liste des paramètres trouvés dedans comme des entrées de %defaults sans que ce soit confondu avec entrées de %defaults provenant de ce qui a ét lu dans le fichier.
Si tu regardes la structure en faisant
print Dumper(%defaults);
La ou je te l'ai indiqué, ça devrait être assez clair:
Sur un exemple bidon comme celui ci:

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Profile origin="get" version="3.0.1" date="2015-12-02T11:44:17Z">
  3. <Catalog id="Catalogue1" version="2.0">
  4.  <Parameter name="Parametre1" value="Valeur1"/>
  5.  <Parameter name="Parametre2" value="Valeur2"/>
  6. </Catalog>
  7. <Catalog id="Catalogue2" version="2.0">
  8.  <Parameter name="file" value="/dev/null">
  9.   <Target class="example" instance="NetBios"/>
  10.  </Parameter>
  11.  <Parameter name="file" value="/dev/null">
  12.   <Target class="example" instance="LanManager"/>
  13.  </Parameter>
  14. </Catalog>
  15. </Profile>


Ca donne en sortie de Dumper:

$VAR1 = 'Catalogue1';
$VAR2 = {
          'Parametre1' => 'Valeur1',
          'Parametre2' => 'Valeur2',
          '3F56E1C5-D6B9-1014-9A88-CDB8776B8231' => [
                                                      'Parametre1',
                                                      'Parametre2'
                                                    ]
        };
$VAR3 = 'Catalogue2';
$VAR4 = {
          'LanManager--file' => '/dev/null',
          'NetBios--file' => '/dev/null',
          '3F56E1C5-D6B9-1014-9A88-CDB8776B8231' => [
                                                      'NetBios--file',
                                                      'LanManager--file'
                                                    ]
        };
$VAR5 = '3F56E1C5-D6B9-1014-9A88-CDB8776B8231';
$VAR6 = [
          'Catalogue1',
          'Catalogue2'
        ];


 
Bref on a une structure

%defaults = { 'Catalogue1' => { 'Parametre1' => 'Valeur1',
                                'Parametre2' => 'Valeur2',
                                '3F56E1C5-D6B9-1014-9A88-CDB8776B8231' => [ 'Parametre1',
                                                                            'Parametre2'
                                                                          ]
            },
              'Catalogue2' => { 'LanManager--file' => '/dev/null',
                                'NetBios--file' => '/dev/null',
                                '3F56E1C5-D6B9-1014-9A88-CDB8776B8231' => [ 'NetBios--file',
                                                                            'LanManager--file'
                                                                          ]
            },
              '3F56E1C5-D6B9-1014-9A88-CDB8776B8231' => [ 'Catalogue1',
                                                          'Catalogue2'
                                                        ]
            }
}


Je suis obligé de maintenir ces listes avec '3F56E1C5-D6B9-1014-9A88-CDB8776B8231' afin d'avoir le bon ordre, car les clés d'un hash ne sont pas dans l'ordre ou elles ont été lues dans le fichier (en fait, elles sont même dans un ordre aléatoire qui change à chaque exécution dans les versions modernes de Perl)
 
A+,


Message édité par gilou le 10-12-2015 à 19:41:01

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

Marsh Posté le 10-12-2015 à 19:38:42    

Merci bien de l'explication, j'ai essaye aussi avec le Dumper
j'ai meme change de version malheureusement toujours rien.
Mes sinceres remerciement a toi Gilou
 
Salut Gilou je pense que j'ai compris a quel niveau le probleme se trouve le probleme quand il rencontre les 'value' comme sur la foto  
 
il ecrit cela dans plusieurs champs.
 
A-


Message édité par Henri772 le 20-12-2015 à 16:13:07
Reply

Marsh Posté le 14-12-2015 à 17:28:43    

Le probleme a ete resolu c'etait effectivement au niveau d'excel comme tu l'avais deja souligne. Quand on utilise la nouvelle version 2013 on n'a plus se probleme.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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