CSVM : interface Perl

Je n’utilise plus Perl, mais ce langage à servi pour la mise au point d’un premier parseur CSVM opérationnel (module build::csvm) et d’outils associés (développés en 2002-2004) . Les codes ont servi de base pour le toolkit Python développé ultérieurement et ou nous retrouvons un espace de noms similaire, il n’y a pas de discontinuité. Il s’agit de codes ‘fossiles’ avec un intérêt historique, mais qui posent des bases de compréhension pour un article traitant des dictionnaires CSVM et utilisant Perl aussi.

Publications initiales : buidez.net (2012), rapports techniques sur arXiv (2012) – Version refondue et mise à jour en 2024-2025.

1. L’objet CSVM en Perl

Fonctionnellement l’API CSVM est organisée en 3 couches: le fichier, le parseur qui va transformer le fichier en objet CSVM, sans interprétation, puis la couche applicative qui va utiliser l’objet et l’interpréter. Dans le langage Perl, la structure de données CSVM correspondait à un objet $csvm_ptr  qui était défini dans le module build::csvm. Cet objet regroupait les champs suivants : la source du fichier, les informations d’en-tête, le titre, les types de colonnes, les largeurs, les données elles-mêmes organisées en matrice, et éventuellement des métadonnées.

Field Type Init Information
SOURCE String = undef; CSV/CSVM file name
CSV String = undef; CSV or CSVM (CSV filetype)
HEADER_N Integer = 0; Value of c+1
HEADER Array [0..c] of String = []; CSVM #HEADER fields list
TITLE_N Integer = 0; Typically 1, let for future use
TITLE String = undef; CSVM title
TYPE_N Integer = 0; Value of c+1
TYPE Array [0..c] of String = []; CSVM #TYPE fields list
WIDTH_N Integer = 0; Value of c+1
WIDTH Array [0..c] of String = []; CSVM #WIDTH fields list
DATA_R Integer = 0; r+1, numer of CSVM data rows
DATA_C Integer = 0; c+1, numer of CSVM data columns
DATA Matrix [0..r][0..c] of String = []; CSVM data matrix
META String = undef; CSVM #META field string

Cette organisation n’a pas beaucoup changé en Python, car elle a fait ses preuves et lorsqu’on l’exploite à fond elle est surprenante en termes de fluidité et de possibilités, des extensions opérationnelles (dictionnaires, annotations et surcharges) ou des preuves de concept ont été développées.

2. Lecture d’un flot CSVM

Pour lire un fichier CSVM, il convenait d’importer le module et d’initialiser un objet $csvm_ptr :

Puis nous pouvions charger un fichier CSVM via la méthode csvm_ptr_read_csvm de l’objet précédent, la chaîne $in_file_path.$in_file_name est une concaténation du chemin d’accès et du nom du fichier CSVM :

Dans ce cas, le fichier CSVM utilise des tabulations comme séparateurs de champs. Mais si les délimiteurs sont différents, une méthode csvm_ptr_read_extended_csvm  permettait de spécifier la valeur du caractère séparateur. Il était également possible de charger un fichier dans une chaîne de caractères ($s), puis de l’importer dans l’objet, en connaissant le séparateur de lignes ($lsep) et le séparateur de champs ($fsep), à l’aide de la méthode csvm_ptr_get_csvm.

Il était alors possible d’appliquer quelques méthodes ou d’accéder à chaque attribut de la structure de données :

Puis de nettoyer la mémoire à la fin des opérations :

Il était également possible d’accéder aux données CSVM sans passer par un objet de type csvm_ptr, une fonction de build::csvm permettait de renvoyer une matrice à partir d’une chaine de caractères ($s dans l’exemple) issue d’un fichier CSVM :

Ou nous retrouvons les arguments $lsep et $fsep pour les séparateurs de lignes (typiquement \n) et de champs. Il faut noter qu’aucune analyse préalable de la chaîne CSVM $s n’était effectuée avant de parser, il fallait fournir le nombre de colonnes $fields_n souhaité dans la matrice résultante.

Nous avons ici les bases d’une programmation CSVM en Perl, nous pouvons exploiter l’ensemble de l’objet : métadonnées ou données via la bloc DATA.

3. Conclusion

Il convient de noter que les fonctionnalités offertes par le toolkit Perl sont plus limitées que celles du toolkit Python, développé ultérieurement et basé sur les mêmes principes. Le toolkit Perl (2002-2004) est aujourd’hui considéré comme obsolète, bien qu’il conserve une compatibilité avec la spécification CSVM-1. En Python nous retrouverons l’objet csvm_ptr avec des attributs globalement similaires, mais avec quelques ajouts pour le support d’extensions. En Python, les méthodes pour la lecture des fichiers/chaines de caractères ont été dissociées et transformées en fonctions. Ces fonctions utilisent l’objet avec un espace de nom similaire, par exemple csvm_ptr_read_csvm(self ...) au lieu $self->csvm_ptr_read_csvm(...) mais ne le surchargent pas, l’objectif étant de distribuer ces fonctions (plus nombreuses qu’en Perl) dans des modules distincts.

Liens et lectures
Retour en haut