Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Modules
Modules Toutes vos questions sur l'utilisation, l'installation, la création de modules Perl sous Windows/Linux/Unix/MacOS. Avant de poster, veuillez consulter les FAQs perl, les cours Perl et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/10/2012, 11h12   #21
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Juste pour précision, dans un fichier, il n'y a qu'une seule balise <measTypes> ?
Et celle-ci est associée l'unique balise measValues qui contient toutes les balises MeasValue avec les informations ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 11h19   #22
synx91
Candidat au titre de Membre du Club
 
Inscription : septembre 2012
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2012
Messages : 51
Points : 11
Points : 11
Oui, là il n'y en a qu'une car j'ai pris un extrait du fichier.

En réalité il y en a plusieurs mais tu as raison, à chaque fois qu'il y a la balise measTypes, vient ensuite la balise measValues.

Par exemple, il y a une balise measTypes avec 7 MeasType, puis dans le measValues il y a 250 (ça peut être différent) measObjInstId avec pour chacun d'eux 7 iValue.
Et ça reprend avec une balise measTypes avec 15 MeasType etc...
synx91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 11h25   #23
synx91
Candidat au titre de Membre du Club
 
Inscription : septembre 2012
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2012
Messages : 51
Points : 11
Points : 11
Petite précision, la balise measValues n'est pas une balise "enfant" de measTypes.
synx91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 11h35   #24
synx91
Candidat au titre de Membre du Club
 
Inscription : septembre 2012
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2012
Messages : 51
Points : 11
Points : 11
J'ai apporté une amélioration au code:
Code perl :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
 
my $file = 'output-test.txt';
 
my $twig1=XML::Twig->new(
	TwigRoots => {'MeasType' => \&print_type, 'measObjInstId' => \&print_type, 'iValue' => \&print_type}
	);
 
$twig1->parsefile($file);
 
my @type;
 
sub print_type
{my ($twig1, $elt)=@_;
	# @type = $elt->text;
	print $elt->text;
	print "\n";
	$twig1->purge;        #libère la mémoire
}
synx91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 11h36   #25
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Voici un exemple de programme testé :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
 
my $fichier_xml = 'test.xml'; 
 
my $twig = new XML::Twig( 
  Twig_handlers => { 
    'measTypes' => \&MeaTypes,
    'MeasValue' => \&AnalyseValues, 
  }, 
);
 
my @LesMeaTypes;
$twig->parsefile($fichier_xml);
 
# Stockage des MeaTypes 
sub MeaTypes {
  my ( $twig, $TwigMeaTypes ) = @_;
 
  @LesMeaTypes = ();
  foreach my $TwigMeasType ( $TwigMeaTypes->children('MeasType') ) {
    push @LesMeaTypes, $TwigMeasType->text;
  }
 
  return;
} 
 
sub AnalyseValues {
  my ( $twig, $TwigMeasValue ) = @_;
 
  my $measObjInstId = $TwigMeasValue->first_child('measObjInstId')->text;
  print "measObjInstId : $measObjInstId\n";
  my $compteur = 0;
  foreach my $TwigMeasType ( $TwigMeasValue->first_child('measResults')->children('iValue') ) {
    print "$LesMeaTypes[$compteur] = ", $TwigMeasType->text, "\n";
    $compteur++;
  }
 
  return;
}
Je ne sais pas s'il répond par la suite à vos cas particuliers. Il faudrait déjà le tester.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/10/2012, 11h39   #26
synx91
Candidat au titre de Membre du Club
 
Inscription : septembre 2012
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2012
Messages : 51
Points : 11
Points : 11
Maintenant le code (que j'ai mis plus haut) parse le fichier XML une seule fois (merci pour la remarque) et en résultat j'ai bien les valeurs une par une comme elle apparaisse dans le fichier XML.
Reste à savoir comment les afficher comme je le veux?
synx91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 11h44   #27
synx91
Candidat au titre de Membre du Club
 
Inscription : septembre 2012
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2012
Messages : 51
Points : 11
Points : 11
Citation:
Envoyé par djibril Voir le message
Voici un exemple de programme testé :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
 
my $fichier_xml = 'test.xml'; 
 
my $twig = new XML::Twig( 
  Twig_handlers => { 
    'measTypes' => \&MeaTypes,
    'MeasValue' => \&AnalyseValues, 
  }, 
);
 
my @LesMeaTypes;
$twig->parsefile($fichier_xml);
 
# Stockage des MeaTypes 
sub MeaTypes {
  my ( $twig, $TwigMeaTypes ) = @_;
 
  @LesMeaTypes = ();
  foreach my $TwigMeasType ( $TwigMeaTypes->children('MeasType') ) {
    push @LesMeaTypes, $TwigMeasType->text;
  }
 
  return;
} 
 
sub AnalyseValues {
  my ( $twig, $TwigMeasValue ) = @_;
 
  my $measObjInstId = $TwigMeasValue->first_child('measObjInstId')->text;
  print "measObjInstId : $measObjInstId\n";
  my $compteur = 0;
  foreach my $TwigMeasType ( $TwigMeasValue->first_child('measResults')->children('iValue') ) {
    print "$LesMeaTypes[$compteur] = ", $TwigMeasType->text, "\n";
    $compteur++;
  }
 
  return;
}
Je ne sais pas s'il répond par la suite à vos cas particuliers. Il faudrait déjà le tester.
Tout simplement WOOOHHH.

C'est exactement ce que je recherchais, ça marche nickel

Un grand merci!
synx91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 11h47   #28
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Si vous avez besoin de plus d'explications, n'hésitez pas.
Sinon, comment faites-vous la conversion ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 11h54   #29
synx91
Candidat au titre de Membre du Club
 
Inscription : septembre 2012
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2012
Messages : 51
Points : 11
Points : 11
Voilà ce que j'utilisais (dans un autre script):
Code :
1
2
3
4
5
	if ($ligne =~ m{<measObjInstId>\s*(.*?)\s*</measObjInstId>}) {
		$ligne =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;
		$ligne =~ s/\s+//g;
		print FILE_OUT "$ligne\n";
	}
Il faut que je l'adapte pour ce script maintenant.
synx91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 12h02   #30
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Il suffit d'utiliser une procédure. Et pour mettre tout le résultat dans un fichier, voici le programme complet :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
 
my $fichier_xml = 'test.xml'; 
my $fichier_out = 'test.txt'; 
 
my $twig = new XML::Twig( 
  Twig_handlers => { 
    'measTypes' => \&MeaTypes,
    'MeasValue' => \&AnalyseValues, 
  }, 
);
 
my @LesMeaTypes;
open my $fh, '>', $fichier_out or die "Impossible de créer $fichier_out\n"; 
$twig->parsefile($fichier_xml);
close $fh;
# Stockage des MeaTypes 
sub MeaTypes {
  my ( $twig, $TwigMeaTypes ) = @_;
 
  @LesMeaTypes = ();
  foreach my $TwigMeasType ( $TwigMeaTypes->children('MeasType') ) {
    push @LesMeaTypes, $TwigMeasType->text;
  }
 
  return;
} 
 
sub AnalyseValues {
  my ( $twig, $TwigMeasValue ) = @_;
 
  my $measObjInstId = $TwigMeasValue->first_child('measObjInstId')->text;
  print {$fh} "measObjInstId : $measObjInstId\n";
  my $compteur = 0;
  foreach my $TwigMeasType ( $TwigMeasValue->first_child('measResults')->children('iValue') ) {
    print {$fh} conversion($LesMeaTypes[$compteur]), ' = ', $TwigMeasType->text, "\n";
    $compteur++;
  }
 
  return;
} 
 
sub conversion {
  my $mot = shift;
 
  $mot =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;
	$mot =~ s/\s+//g;
  return $mot;
}
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 12h19   #31
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 487
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 487
Points : 31 589
Points : 31 589
Merci de penser au tag résolu si c'est OK.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2012, 13h32   #32
synx91
Candidat au titre de Membre du Club
 
Inscription : septembre 2012
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2012
Messages : 51
Points : 11
Points : 11
C'est fait, j'attendais juste de voir si la partie "conversion" était ok pour toi, mais ce n'est pas le même sujet.
synx91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h49.


 
 
 
 
Partenaires

Hébergement Web