OVH Cloud OVH Cloud

structure perlienne d'un d'un equivalent de CSV

4 réponses
Avatar
Patrice Karatchentzeff
Salut,

Je bute sur un problème de méthode... et comme il est récurrent, je
préfère avoir l'avis d'éminents spécialistes...

Je n'arrive pas à me représenter - en Perl - l'équivalent d'un fichier
CSV dont les colonnes seraient nommées et dont on pourrait aussi
manipuler les lignes...

Je m'explique :

col.1 col.2 col.3 col.4 col.5

ligne 1 A B C D F
ligne 2 B C D E G
ligne 3 T Z A C X
ligne 4 Z Z Q V B

Les lettres capitales sont des données quelconques, sans dépendances
particulières entre elles, pouvant se répéter.

Je veux pouvoir faire l'équivalent de mettre tout cela dans une table
SQL et manipuler les colonnes ou les lignes...

Par exemple, si la col.1 s'appelle « toto », je veux pouvoir dire
« dans la colonne toto, cherche les motifs truc et sors-moi les lignes
correspondantes ». Bien sûr, on pourrait faire l'équivalent d'une
jointure aussi cela va de soit...

À chaque fois, je pars dans des structures alambiquées (genre hash de
hash) et je m'y perds souvent...

donc deux questions :

1) quelle est la bonne structure ?

2) quel est la démarche intellectuelle pour trouver la solution à tous
les coups ?

Merci d'avance,

PK

--
      |\      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:p.karatchentzeff@free.fr
     |,4-  ) )-,_. ,\ (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'\_)       

4 réponses

Avatar
Mark Clements
Patrice Karatchentzeff wrote:
Salut,

Je bute sur un problème de méthode... et comme il est récurrent, je
préfère avoir l'avis d'éminents spécialistes...

Je n'arrive pas à me représenter - en Perl - l'équivalent d'un fichier
CSV dont les colonnes seraient nommées et dont on pourrait aussi
manipuler les lignes...

Je m'explique :

col.1 col.2 col.3 col.4 col.5

ligne 1 A B C D F
ligne 2 B C D E G
ligne 3 T Z A C X
ligne 4 Z Z Q V B

Les lettres capitales sont des données quelconques, sans dépendances
particulières entre elles, pouvant se répéter.

Je veux pouvoir faire l'équivalent de mettre tout cela dans une table
SQL et manipuler les colonnes ou les lignes...

Par exemple, si la col.1 s'appelle « toto », je veux pouvoir dire
« dans la colonne toto, cherche les motifs truc et sors-moi les lignes
correspondantes ». Bien sûr, on pourrait faire l'équivalent d'une
jointure aussi cela va de soit...

À chaque fois, je pars dans des structures alambiquées (genre hash de
hash) et je m'y perds souvent...

donc deux questions :

1) quelle est la bonne structure ?

2) quel est la démarche intellectuelle pour trouver la solution à tous
les coups ?



Ceci n'est pas une réponse directe à ton question, mais:

tu pourrais mettre les données dans une structure "normale", ça veux dire

my $data = [
[ qw( A B C D F ) ],
[ qw( B C D E G ) ],
[ qw( T Z A C X ) ],
[ qw( Z Z Q V B ) ],

]

et utiliser DBD::Sponge pour faire des requêtes.

my $sponge = DBI->connect("dbi:Sponge:","","",{ RaiseError => 1 });
my $sth = $sponge->prepare( $statement,
{ rows => $data,
NAME => qw( toto col2 col3 )
},
);

Moi, je pense que je mettrais les données dans une base SQLite et
utiliser DBD::SQLite.

Mark

Avatar
Patrice Karatchentzeff
Mark Clements writes:

Patrice Karatchentzeff wrote:


[...]

tu pourrais mettre les données dans une structure "normale", ça veux dire

my $data = [
[ qw( A B C D F ) ],
[ qw( B C D E G ) ],
[ qw( T Z A C X ) ],
[ qw( Z Z Q V B ) ],

]

et utiliser DBD::Sponge pour faire des requêtes.

my $sponge = DBI->connect("dbi:Sponge:","","",{ RaiseError => 1 });
my $sth = $sponge->prepare( $statement,
{ rows => $data,
NAME => qw( toto col2 col3 )
},
);

Moi, je pense que je mettrais les données dans une base SQLite et
utiliser DBD::SQLite.


J'y ai songé mais je voudrai plutôt n'utiliser que Perl...

Merci quand même,

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       

Avatar
Stéphane Müller
Le module DBD::CSV pourrait répondre à tes besoins : il permet de voir un fichier CSV comme une
table et donc d'effectuer des requête SQL dessus. Tu peux également regarder le module DBD::AnyData.

Stéphane


"Patrice Karatchentzeff" a écrit dans le message de news:

Salut,

Je bute sur un problème de méthode... et comme il est récurrent, je
préfère avoir l'avis d'éminents spécialistes...

Je n'arrive pas à me représenter - en Perl - l'équivalent d'un fichier
CSV dont les colonnes seraient nommées et dont on pourrait aussi
manipuler les lignes...

Je m'explique :

col.1 col.2 col.3 col.4 col.5

ligne 1 A B C D F
ligne 2 B C D E G
ligne 3 T Z A C X
ligne 4 Z Z Q V B

Les lettres capitales sont des données quelconques, sans dépendances
particulières entre elles, pouvant se répéter.

Je veux pouvoir faire l'équivalent de mettre tout cela dans une table
SQL et manipuler les colonnes ou les lignes...

Par exemple, si la col.1 s'appelle « toto », je veux pouvoir dire
« dans la colonne toto, cherche les motifs truc et sors-moi les lignes
correspondantes ». Bien sûr, on pourrait faire l'équivalent d'une
jointure aussi cela va de soit...

À chaque fois, je pars dans des structures alambiquées (genre hash de
hash) et je m'y perds souvent...

donc deux questions :

1) quelle est la bonne structure ?

2) quel est la démarche intellectuelle pour trouver la solution à tous
les coups ?

Merci d'avance,

PK

--
| _,,,---,,_ Patrice KARATCHENTZEFF
ZZZzz /,`.-'`' -. ;-;;,_ mailto:
|,4- ) )-,_. , ( `'-' http://p.karatchentzeff.free.fr
'---''(_/--' `-'_)


Avatar
espie
In article ,
Patrice Karatchentzeff wrote:
Mark Clements writes:

Patrice Karatchentzeff wrote:


[...]

tu pourrais mettre les données dans une structure "normale", ça veux dire

my $data = [
[ qw( A B C D F ) ],
[ qw( B C D E G ) ],
[ qw( T Z A C X ) ],
[ qw( Z Z Q V B ) ],

]

et utiliser DBD::Sponge pour faire des requêtes.

my $sponge = DBI->connect("dbi:Sponge:","","",{ RaiseError => 1 });
my $sth = $sponge->prepare( $statement,
{ rows => $data,
NAME => qw( toto col2 col3 )
},
);

Moi, je pense que je mettrais les données dans une base SQLite et
utiliser DBD::SQLite.


J'y ai songé mais je voudrai plutôt n'utiliser que Perl...


En fait, c'est plutot dans l'esprit perl d'eviter de reinventer la roue,
et donc d'utiliser des modules standard.

En terme de fonctionnalite, tu es bien parti pour reinventer un bout de
SQL plus les structures de donnees sous-jacentes.

Soit tu ne separes pas representation des donnees et manipulation, et
tu vas reinventer certains modules antiques peu employes ces jours-ci.

Soit tu separes, et vas immanquablement reinventer DBI + une base de donnees.
DBD::Sponge etant sans doute l'exemple le plus leger (pas forcement approprie).

Si tu veux vraiment faire du CSV, DBD::CSV existe.

Pour la lecture des CSV, DBI-like, il y a Text-RecordParser, qui est
relativement simple et comprehensible...