parser table de hash

Le
c-note
Bonjour,

je dois parser une table de hash (de hash). l'instruction qui suit
retourne le contenu de la table de hash en question :

print Data::Dumper::Dumper( %res ), "";

$VAR1 = {
'2' => {
'available_space_var_lib_pgsql' => '199G',
'date_end' => '2007-10-21 03:48:27',
'duree_total' => '1082 secondes',
'cpuspeed' => '2.66GHz',
'cpumodel' => 'Intel(R) Xeon(R) CPU X5355@ 2.66GHz',
'workingprocess' => '8',
'dbname' => 'dbstats',
'use_var_lib_pgsql' => '15%',
'filesize' => '5.1G',
'filename' => '/var/backup/stats.tgz',
'nbcpu' => '8 ',
'memtotal' => '16440140 kB',
'date_begin' => '2007-10-21 03:30:25',
'date_end_compression' => '2007-10-21 03:48:27',
'date_end_save' => '2007-10-21 03:46:07'
},
'1' => {
'available_space_var_lib_pgsql' => '199G',
'date_end' => '2007-10-20 03:46:42',
'duree_total' => '981 secondes',
'cpuspeed' => '2.66GHz',
'cpumodel' => 'Intel(R) Xeon(R) CPU X5355@ 2.66GHz',
'workingprocess' => '8',
'dbname' => 'dbstats',
'use_var_lib_pgsql' => '13%',
'filesize' => '4.6G',
'filename' => '/var/backup/stats.tgz',
'nbcpu' => '8 ',
'memtotal' => '16440140 kB',
'date_begin' => '2007-10-20 03:30:21',
'date_end_compression' => '2007-10-20 03:46:42',
'date_end_save' => '2007-10-20 03:44:44'
}
};

Je dois insérer les valeurs et les clés de la table de hash dans une
base de données.

Je possède une table save_table qui contient les champs
'available_space_var_lib_pgsql' , 'date_end' , 'duree_total' , etc

Aussi, j'aimerais convertir l'affichage précédent en quelque chose du
genre :

# My record 1
INSERT INTO save_table ('available_space_var_lib_pgsql' , 'date_end' ,
'duree_total' , 'cpuspeed' , 'cpumodel' , 'dbname' , 'use_var_lib_pgsql'
, 'filesize' , 'filename' , 'nbcpu' , 'memtotal' , 'date_begin' ,
'date_end_compression') VALUES ('199G', '2007-10-20 03:46:42', '981
secondes', '2.66GHz', 'Intel(R) Xeon(R) CPU X5355@ 2.66GHz', 8,
'unedic_stats', '13%', '4.6G', '/var/cli/backup/unedic_cfgstat.sdb',
'8 ', '16440140 kB', '2007-10-20 03:30:21', '2007-10-20 03:46:42',
'2007-10-20 03:44:44')

# My record 2
INSERT INTO save_table ('available_space_var_lib_pgsql' , 'date_end' ,
'duree_total' , 'cpuspeed' , 'cpumodel' , 'dbname' , 'use_var_lib_pgsql'
, 'filesize' , 'filename' , 'nbcpu' , 'memtotal' , 'date_begin' ,
'date_end_compression') VALUES ('199G', '2007-10-21 03:48:27', '1082
secondes', '2.66GHz', 'Intel(R) Xeon(R) CPU X5355@ 2.66GHz', 8,
'unedic_stats', '15%', '5.1G', '/var/cli/backup/unedic_cfgstat.sdb',
'8 ', '16440140 kB', '2007-10-21 03:30:25', '2007-10-21 03:48:27',
'2007-10-21 03:46:07')


Existe t-il un moyen simple et fiable d'y parvenir (keys, values, ) ?

merci de vos réponses
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #153437
À (at) Tue, 23 Oct 2007 13:52:44 +0200,
c-note
[... une structure de données Perl...]

Aussi, j'aimerais convertir l'affichage précédent en quelque chose du
genre :


[... du texte ressemblant à du SQL...]

Existe t-il un moyen simple et fiable d'y parvenir (keys, values, ...) ?


C'est assez facile à faire si vous souhaitez passer de la structure de
données à du texte (avec keys et values par exemple)...

Maintenant, si vous souhaitez que le texte généré soit du SQL
*valide*, je vous conseille fortement d'utiliser le module DBI (avec
le driver DBD qui convient à votree SGBD) et son mécanisme de
'placeholders'.


--
Paul Gaborit - Perl en français -
c-note
Le #153436
À (at) Tue, 23 Oct 2007 13:52:44 +0200,
c-note
[... une structure de données Perl...]

Aussi, j'aimerais convertir l'affichage précédent en quelque chose du
genre :


[... du texte ressemblant à du SQL...]

Existe t-il un moyen simple et fiable d'y parvenir (keys, values, ...) ?


C'est assez facile à faire si vous souhaitez passer de la structure de
données à du texte (avec keys et values par exemple)...
Le morceau de code suivant semble convenir :


my $VAR1 = {
bla bla (copier coller le contenu de $VAR dans le post precedent)
}

my ($ALLKEY,$ALLVALUE)=("","");;

foreach $key (sort keys %$VAR1) {
my $val = $$VAR1{$key};
foreach $key (sort keys %$val){
my $val = $$val{$key};
$ALLKEY = $ALLKEY.", "."'$key'";
$ALLVALUE = $ALLVALUE.", "."'$val'";
}
my $resustr = "INSERT INTO save_table (".$ALLKEY.") VALUE
"."(".$ALLVALUE.");n";
$resustr =~ s/(,/(/g;
$ALLKEY ="";
$ALLVALUE ="";
print $resustr;
}

Cela ne me semble pas la meilleur façon de faire !
C'est limite du bricolage.


Maintenant, si vous souhaitez que le texte généré soit du SQL
*valide*, je vous conseille fortement d'utiliser le module DBI (avec
le driver DBD qui convient à votree SGBD) et son mécanisme de
'placeholders'.


Je vais voir du coté de DBI



Paul Gaborit
Le #153435
À (at) Tue, 23 Oct 2007 15:07:17 +0200,
c-note
À (at) Tue, 23 Oct 2007 13:52:44 +0200,
c-note
[... une structure de données Perl...]

Aussi, j'aimerais convertir l'affichage précédent en quelque chose du
genre :


[... du texte ressemblant à du SQL...]

Existe t-il un moyen simple et fiable d'y parvenir (keys, values, ...) ?


C'est assez facile à faire si vous souhaitez passer de la structure de
données à du texte (avec keys et values par exemple)...
Le morceau de code suivant semble convenir :


my $VAR1 = {
bla bla (copier coller le contenu de $VAR dans le post precedent)
}

my ($ALLKEY,$ALLVALUE)=("","");;

foreach $key (sort keys %$VAR1) {
my $val = $$VAR1{$key};
foreach $key (sort keys %$val){
my $val = $$val{$key};
$ALLKEY = $ALLKEY.", "."'$key'";
$ALLVALUE = $ALLVALUE.", "."'$val'";
}
my $resustr = "INSERT INTO save_table (".$ALLKEY.") VALUE
"."(".$ALLVALUE.");n";
$resustr =~ s/(,/(/g;
$ALLKEY ="";
$ALLVALUE ="";
print $resustr;
}

Cela ne me semble pas la meilleur façon de faire !
C'est limite du bricolage.



C'est sûr que ce n'est pas très "perlien". On peut faire aussi comme
ça (en supposant que $VAR1 contient ce qu'il faut) :

foreach my $key (sort keys %$VAR1) {
my @fields = sort keys %{$VAR1->{$key}};
my @values = map {$VAR1->{$key}{$_}} @fields;
my $sql = sprintf("INSERT INTO save_table (%s) VALUES (%s);",
join(",", @fields), join(",", @values));
print "$sqln";
}

Je vais voir du coté de DBI


C'est quand même beaucoup plus pratique pour piloter un SGBD...

--
Paul Gaborit - Perl en français -


c-note
Le #153434

C'est sûr que ce n'est pas très "perlien". On peut faire aussi comme
ça (en supposant que $VAR1 contient ce qu'il faut) :

foreach my $key (sort keys %$VAR1) {
my @fields = sort keys %{$VAR1->{$key}};
my @values = map {$VAR1->{$key}{$_}} @fields;
my $sql = sprintf("INSERT INTO save_table (%s) VALUES (%s);",
join(",", @fields), join(",", @values));
print "$sqln";
}


Effectivement c'est plus propre comme code :-)


Je vais voir du coté de DBI


C'est quand même beaucoup plus pratique pour piloter un SGBD...



En effet.

Merci


Publicité
Poster une réponse
Anonyme