Java et CSV – Tour d’horizon des solutions open source

Sujet récurrent dans le domaine de l’informatique de gestion, le traitement des fichiers CSV fait partie des incontournables du genre. Il bénéficie à ce titre d’une offre abondante dans le monde Open Source, il n’est cependant pas toujours évident de trouver les informations utiles pour faire un choix adapté aux besoins.

Cet article propose un rapide tour d’horizon des bibliothèques Java permettant la gestion de l’import/export du format CSV les plus répandues, ainsi que quelques éléments de réflexion à considérer pour s’orienter.

Bibliothèque externe ou développement spécifique ?

Si la problématique d’écriture de fichiers CSV pose généralement peu de difficultés, malgré son apparente simplicité la lecture de ces mêmes fichiers peut s’avérer complexe. En effet, si l’on considère l’absence de spécification de référence, ainsi que la possible hétérogénéité des systèmes d’encodage, on obtient une première idée des problématiques possibles. S’y ajoutent entre autres la possible variabilité des séparateurs utilisés d’un fichier à l’autre, l’utilisation ou non des guillemets, la gestion d’éventuelles imbrications des caractères d’échappement… Difficile d’être exhaustif tant les subtilités sont nombreuses.

En conséquence rien n’interdit le développement d’une solution spécifique pour un cas bien identifié, mais dans un contexte d’industrialisation des développements il reste préférable de ne pas réinventer la roue et favoriser l’homogénéité des développements en choisissant un outil suffisamment flexible.

Estimer la robustesse des bibliothèques

Si l’on considère le dynamisme des projets, on constate que peu d’entre eux présentent une activité importante, que l’on considère les forums ou les bug trackers associés. Parallèlement la version courante correspond souvent à un numéro peu élevé.

Ces critères généralement retenus pour estimer à première vue le niveau de maturité et de support d’un projet ne semblent pas adaptés au sujet qui nous intéresse, lequel a priori implique peu d’améliorations et de support sur le long terme. On recherchera néanmoins les signes d’une communauté active via un forum ou un bug tracker animés sans oublier une documentation efficace nourrie d’exemples d’utilisation proches des problématiques cibles.

Fonctionnalités/API

L’ensemble de ces bibliothèques propose évidemment des méthodes pour lire et/ou générer des fichiers CSV, mais les moyens et fonctionnalités complémentaires diffèrent d’un outil à l’autre. On distingue assez rapidement des bibliothèques orientées bas niveau de celles relativement plus évoluées. Les fonctionnalités des premières se limitent le plus souvent à l’extraction des données rendues disponibles dans un format de type String. Les plus complètes proposent une intégration plus directe des données par l’intermédiaire d’un paramétrage à définir.

Les capacités proposées pour la lecture des fichiers varient entre une lecture ligne par ligne suivant un modèle de type Iterator et la génération d’une collection représentative du fichier dans son intégralité. Le plus souvent ces deux fonctionnalités sont présentes.

Pour l’import de fichier, certaines bibliothèques fournissent une API permettant d’accéder directement aux données brutes, d’autres facilitent l’intégration directe des données sous forme de Beans (voire nested Beans), Collections, Arrays et proposent parfois la génération directe de requêtes SQL pour l’intégration des données en base.

La validation des données et/ou la gestion d’erreurs n’est pas systématiquement présente et les rares solutions proposées concernent : la définition d’un filtre sur les données en entrée, l’utilisation d’un handler d’erreurs associée au lecteur du fichier, ou l’utilisation d’une collection chargée de stocker les erreurs rencontrées.

Du point de vue de la gestion du format des données, les fonctionnalités varient d’une gestion manuelle au cas par cas à la possibilité de configurer des transformateurs par donnée, le plus souvent en paramétrant les objets de lecture et d’écriture, et parfois à l’aide d’une configuration XML, voire d’annotations sur les Beans cibles.

Pour permettre le paramétrage du mapping des colonnes, certaines bibliothèques nécessitent un traitement spécifique directement inclus dans le code, d’autres le gèrent moyennant l’utilisation d’annotations, enfin certains outils imposent la définition du mapping dans un fichier XML.

Enfin, au-delà de la gestion du format CSV, ces bibliothèques prennent parfois en charge des formats complémentaires tels que les fichiers à champs de taille fixe, les fichiers à délimiteurs autres, les fichiers XML, XLS, voire la lecture d’enregistrements sur plusieurs lignes, notamment pour traiter la notion de master/detail.

Intégration

Exception faite des classes de tests qui dépendent majoritairement de JUnit, la plupart de ces bibliothèques ne dépendent pas de bibliothèques tierces. Par conséquent l’intégration pourra se faire sans conflits avec les dépendances des projets considérés.

Ces bibliothèques sont en majorité soumises à la licence Apache v2 ce qui facilite leur intégration, notamment pour une utilisation professionnelle.

Synthèse comparative

Récapitulatif des caractéristiques principales
Projet* Lecture* Binding* Mapping* Formatage* Gestion
d’erreurs*
BeanFiles bloc & iteration nested code oui non
BeanIO bloc & iteration nested XML oui système de handlers
Commons CSV bloc & iteration non code non non
csvtosql N.A. N.A. XML non non
Flatpack bloc & iteration non XML / tables BD non stockage
JavaCSV iteration non code non non
JCSV bloc & iteration bean code ou annotations oui filtres
JSefa iteration bean code ou annotations oui ?
OpenCSV bloc & iteration bean code non ?
Ostermiller CSV bloc & iteration non code non non
Skife CSV bloc & évènements non code non non
SuperCSV iteration bean code oui non

NB : Les valeurs à « non » de ce tableau ne sont généralement pas à prendre comme un non ferme pour au moins deux raisons : il se peut que la fonction soit présente sans qu’elle ait été constatée, cette fonction pourrait être incluse dans une version non disponible au moment de l’écriture de cet article.

NB2 : Nous n’avons pu considérer le projet JFileHelper pour cause d’indisponibilité du site correspondant.

Evaluation

L’ensemble de ces bibliothèques propose l’export au format CSV à l’exception de BeanFiles qui n’inclut pas cette fonction ainsi que csvtosql qui exporte les données sous forme de requêtes SQL.

Maven est prêt à l’emploi avec les bibliothèques suivantes : BeanIO, Commons CSV, csvtosql, JCSV, OpenCSV.

Mis à part BeanFiles (LGPL), JavaCSV (LGPL), et Ostermiller CSV (GPL), l’ensemble de ces bibliothèques est sous licence Apache v2.

Exercice difficile mais utile, une notation est proposée à titre indicatif sur des critères subjectifs. Cette note souhaite rendre compte du niveau de chaque outil relativement à l’ensemble des autres. On pourra donc interpréter la valeur « ++ » comme « dans la moyenne » et considérer les valeurs adjacentes « + » et « +++ » respectivement comme « en retrait » et « plus évolué ».

Considérant l’absence de données comparables, les critères de popularité et de qualité de la communauté ne sont pas traités.

Evaluation qualitative
Projet* Fonctions* Maturité* Documentation* Activité*
BeanFiles ++ + ++ +
BeanIO +++ ++ +++ +++
Commons CSV + + + ++
csvtosql + + +++ +
Flatpack +++ ++ ++ ++
JavaCSV + ++ ++ ++
JCSV +++ + +++ +++
JSefa ++ ++ ++ +
OpenCSV ++ +++ ++ ++
Ostermiller CSV ++ +++ ++ ?
Skife CSV + + ++ +
SuperCSV +++ +++ ++ +

Bilan

Les différentes recherches effectuées montrent une certaine prépondérance de la librairie OpenCSV au sein de la communauté open source. Gage de qualité, cette observation nécessite tout de même de considérer une API majoritairement orientée bas niveau.

Dans un registre similaire, les bibliothèques JCSV, SuperCSV et FlatPack apparaîssent comme des candidats relativement complets.

Parmi les projets les plus récents on notera l’émergence de BeanIO, l’un des plus complets en matière de fonctionnalités, déjà intégré dans le projet Apache Camel et compatible avec la solution SpringBatch.

Parallèlement, notons que la vocation affichée de Commons CSV et son affiliation à la communauté Apache semblent prometteuses sans pour autant convaincre étant donné le manque flagrant d’informations et manque de maturité (version 1.0-SNAPSHOT).

Il faut noter que les performances de ces bibliothèques à l’exécution n’ont pas été évaluées. Cet aspect reste un élément important qui devra sans doute être pris en considération pour le choix d’un outil.

Enfin, précisons que d’autres solutions existent mais ne font pas l’objet de cet article. Citons notamment des solutions intégrées destinées à un contexte d’utilisation plus large telles que SpringBatch, Apache Camel ainsi que les ETL en général.

Analyse et veille technologique , , , , , , , ,

1 commentaire


  1. Manu

    Je pense que vous avez omis Smooks !