certain conditions ne menacant - Perl - Programmation
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
A+,
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 |
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
Marsh Posté le 08-12-2015 à 17:32:04
Un exemple de solution qui marche sur tes données
Code :
|
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+,
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.
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 |
A+,
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
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.
Marsh Posté le 09-12-2015 à 12:42:58
salut Gilou voila un apercu de ce que je recois
Marsh Posté le 09-12-2015 à 15:29:09
Sur une simple image, je peux pas aider des masses.
A+,
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
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+,
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+,
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+
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' . |
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+,
Marsh Posté le 09-12-2015 à 17:53:54
Henri772 a écrit :
|
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+,
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
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
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
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 |
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+,
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+
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+,
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 :
|
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+,
Marsh Posté le 09-12-2015 à 23:54:14
Un peu de détails
Code :
|
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 :
|
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+,
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+
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 :
|
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+,
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:
|
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 :
|
Code :
|
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+,
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+
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+,
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';
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 :
|
Ca donne en sortie de Dumper:
$VAR1 = 'Catalogue1'; |
Bref on a une structure
%defaults = { 'Catalogue1' => { 'Parametre1' => 'Valeur1', |
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+,
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-
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.
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.
Message édité par Henri772 le 08-12-2015 à 17:05:25