Introduction à Apache Commons CSV
1. Vue d'ensemble
Apache Commons CSV library possède de nombreuses fonctionnalités utiles pour créer et lire des fichiers CSV.
Dans ce rapide didacticiel, nous verrons comment utiliser cette bibliothèque en montrant un exemple simple.
2. Dépendance 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 -go here.
3. Lecture d'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 ignoré la première ligne car il s'agit de l'en-tête.
Il existe différents types deCSVFormat spécifiant le format du fichier CSV, dont vous pouvez voir un exemple dans le paragraphe suivant.
4. Créer 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éclarationCSVFormat.
5. En-têtes et colonnes de lecture
Il existe différentes manières de lire et d'écrire des 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
C'est le moyen le plus simple de lire les valeurs de colonne. Ceci 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 à un 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 deStrings pour accéder aux valeurs de colonne peut être source d'erreurs. Utiliser 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
Habituellement, les fichiers CSV contiennent des en-têtes dans la première ligne. Par conséquent, dans la plupart des cas, il est prudent de le sauter et de commencer à lire à partir de la deuxième ligne.
Ceci détectera automatiquement les valeurs des colonnes d'accès des 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 commune d’Apache à travers un exemple simple. Vous pouvez en savoir plus sur la bibliothèquehere.
Le code de cet article est disponibleover on Github.