Introduction à Apache Commons CSV

1. Vue d'ensemble

La bibliothèque Apache Commons CSV possède de nombreuses fonctionnalités utiles pour créer et lire des fichiers CSV.

Dans ce rapide tutoriel, nous verrons comment utiliser cette bibliothèque en montrant un exemple simple.

2. Dépendance de Maven

Pour commencer, nous allons importer la dernière version de cette bibliothèque en utilisant Maven:

 org.apache.commons commons-csv 1.4  

Pour vérifier la version la plus récente de cette bibliothèque - allez ici.

3. Lire un fichier CSV

Considérez le fichier CSV suivant appelé book.csv contenant les attributs d'un livre:

author,title Dan Simmons,Hyperion Douglas Adams,The Hitchhiker's Guide to the Galaxy

Voyons comment nous pouvons le lire:

Map AUTHOR_BOOK_MAP = new HashMap() { { put("Dan Simmons", "Hyperion"); put("Douglas Adams", "The Hitchhiker's Guide to the Galaxy"); } }); String[] HEADERS = { "author", "title"}; @Test public void givenCSVFile_whenRead_thenContentsAsExpected() throws IOException { Reader in = new FileReader("book.csv"); Iterable records = CSVFormat.DEFAULT .withHeader(HEADERS) .withFirstRecordAsHeader() .parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); assertEquals(AUTHOR_BOOK_MAP.get(author), title); } }

Nous lisons les enregistrements d'un fichier CSV après avoir sauté la première ligne car il s'agit de l'en-tête.

Il existe différents types de CSVFormat spécifiant le format du fichier CSV, dont vous pouvez voir un exemple dans le paragraphe suivant.

4. Création d'un fichier CSV

Voyons comment nous pouvons créer le même fichier CSV que ci-dessus:

public void createCSVFile() throws IOException { FileWriter out = new FileWriter("book_new.csv"); try (CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT .withHeader(HEADERS))) { AUTHOR_BOOK_MAP.forEach((author, title) -> { printer.printRecord(author, title); }); } }

Le nouveau fichier CSV sera créé avec les en-têtes appropriés car nous les avons spécifiés dans notre déclaration CSVFormat .

5. En-têtes et colonnes de lecture

Il existe différentes manières de lire et d'écrire les en-têtes. De même, il existe différentes manières de lire les valeurs de colonne.

Passons en revue un par un:

5.1. Accès aux colonnes par index

Il s'agit de la manière la plus simple de lire les valeurs de colonne. Cela peut être utilisé lorsque les en-têtes des fichiers CSV ne sont pas connus:

Reader in = new FileReader("book.csv"); Iterable records = CSVFormat.DEFAULT.parse(in); for (CSVRecord record : records) { String columnOne = record.get(0); String columnTwo = record.get(1); }

5.2. Accès aux colonnes par en-têtes prédéfinis

C'est un moyen plus intuitif d'accéder aux colonnes par rapport à l'accès par index:

Iterable records = CSVFormat.DEFAULT .withHeader("author", "title").parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); }

5.3. Utilisation d'énumérations comme en-têtes

L'utilisation de chaînes pour accéder aux valeurs de colonne peut être source d'erreurs. Utiliser des Enums au lieu de Strings rendra le code plus standardisé et plus facile à comprendre:

enum BookHeaders { author, title } Iterable records = CSVFormat.DEFAULT .withHeader(BookHeaders.class).parse(in); for (CSVRecord record : records) { String author = record.get(BookHeaders.author); String title = record.get(BookHeaders.title); }

5.4. Sauter la ligne d'en-tête

En général, les fichiers CSV contiennent des en-têtes sur la première ligne. Par conséquent, dans la plupart des cas, il est prudent de l'ignorer et de commencer à lire à partir de la deuxième ligne.

Cela détectera automatiquement les valeurs des colonnes d'accès aux en-têtes:

Iterable records = CSVFormat.DEFAULT .withFirstRowAsHeader().parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); }

5.5. Créer un fichier avec des en-têtes

De même, nous pouvons créer un fichier CSV avec la première ligne contenant les en-têtes:

FileWriter out = new FileWriter("book_new.csv"); CSVPrinter printer = CSVFormat.DEFAULT .withHeader("author", "title").print(out);

6. Conclusion

Nous avons présenté l'utilisation de la bibliothèque CSV Commons d'Apache à travers un exemple simple. Vous pouvez en savoir plus sur la bibliothèque ici.

Le code de cet article est disponible à l'adresse over sur Github.