Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

parser table de hash

4 réponses
Avatar
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 ), "\n";

$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

4 réponses

Avatar
Paul Gaborit
À (at) Tue, 23 Oct 2007 13:52:44 +0200,
c-note écrivait (wrote):

[... 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 - <http://perso.enstimac.fr/~gaborit/&gt;
Perl en français - <http://perl.enstimac.fr/&gt;

Avatar
c-note
À (at) Tue, 23 Oct 2007 13:52:44 +0200,
c-note écrivait (wrote):

[... 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



Avatar
Paul Gaborit
À (at) Tue, 23 Oct 2007 15:07:17 +0200,
c-note écrivait (wrote):
À (at) Tue, 23 Oct 2007 13:52:44 +0200,
c-note écrivait (wrote):

[... 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 - <http://perso.enstimac.fr/~gaborit/&gt;
Perl en français - <http://perl.enstimac.fr/&gt;



Avatar
c-note

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