Comment écrire dans un fichier CSV en Java

1. Vue d'ensemble

Dans ce bref didacticiel, nous allons apprendre à écrire dans un fichier CSV à l'aide de Java . CSV signifie Valeurs séparées par des virgules et c'est un format courant pour effectuer un transfert de données en masse entre les systèmes.

Pour écrire notre fichier CSV, nous utiliserons les classes du package java.io.

Nous parlerons des caractères spéciaux et de la manière de les gérer. Nous ciblerons notre fichier de sortie pour l'ouvrir dans Microsoft Excel et Google Sheets.

Après notre exemple Java, nous examinerons brièvement certaines bibliothèques tierces disponibles pour travailler avec des fichiers CSV.

2. Écrire avec PrintWriter

Nous allons utiliser un PrintWriter pour écrire notre fichier CSV. Pour un aperçu plus détaillé de l'utilisation de java.io pour écrire dans un fichier, consultez notre article sur l'écriture dans des fichiers.

2.1. Rédaction du CSV

Tout d'abord, créons une méthode pour formater une seule ligne de données, représentée sous la forme d'un tableau de String s:

public String convertToCSV(String[] data) { return Stream.of(data) .map(this::escapeSpecialCharacters) .collect(Collectors.joining(",")); }

Avant d'appeler cette méthode, nous allons maintenant construire quelques exemples de données:

List dataLines = new ArrayList(); dataLines.add(new String[] { "John", "Doe", "38", "Comment Data\nAnother line of comment data" }); dataLines.add(new String[] { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" });

Et avec ces données en main, convertissons chaque ligne avec convertToCSV et écrivons-la dans un fichier:

public void givenDataArray_whenConvertToCSV_thenOutputCreated() throws IOException { File csvOutputFile = new File(CSV_FILE_NAME); try (PrintWriter pw = new PrintWriter(csvOutputFile)) { dataLines.stream() .map(this::convertToCSV) .forEach(pw::println); } assertTrue(csvOutputFile.exists()); }

2.2. Gestion des caractères spéciaux

Dans un fichier CSV, certains caractères posent problème et en tant que développeurs, nous avons rarement un contrôle total sur la qualité de nos données. Voyons maintenant comment gérer les caractères spéciaux.

Pour notre exemple, nous allons nous concentrer sur les virgules, les guillemets et les nouvelles lignes. Les champs contenant des virgules ou des guillemets seront entourés de guillemets doubles et les guillemets doubles seront échappés par des guillemets doubles. Nous éliminerons les nouvelles lignes et les remplacerons chacune par des espaces.

Les caractères qui posent problème et la manière dont ils doivent être traités peuvent varier selon le cas d'utilisation.

Notre méthode convertToCSV appelle la méthode escapeSpecialCharacters sur chaque élément de données lors de la création d'une chaîne.

Implémentons notre méthode escapeSpecialCharacters maintenant:

public String escapeSpecialCharacters(String data) { String escapedData = data.replaceAll("\\R", " "); if (data.contains(",") || data.contains("\"") || data.contains("'")) { data = data.replace("\"", "\"\""); escapedData = "\"" + data + "\""; } return escapedData; }

3. Bibliothèques tierces

Comme nous l'avons vu avec notre exemple, l'écriture d'un fichier CSV peut devenir compliquée lorsque nous commençons à penser aux caractères spéciaux et à la manière de les gérer.

Heureusement pour nous, il existe de nombreuses bibliothèques tierces disponibles pour travailler avec des fichiers CSV et beaucoup d'entre elles gèrent ces caractères spéciaux et d'autres cas exceptionnels qui peuvent se produire.

Jetons un coup d'œil à quelques-uns d'entre eux:

  • Apache Commons CSV: l'offre CSV d'Apache pour travailler avec des fichiers CSV
  • Open CSV: une autre bibliothèque CSV populaire et activement maintenue
  • Flatpack: une bibliothèque CSV open-source en cours de développement
  • CSVeed: Open-source et activement maintenu

4. Conclusion

Dans cet article rapide, nous avons montré comment écrire un fichier CSV à l'aide de la classe PrintWriter de Java . Ensuite, nous avons discuté et traité les caractères spéciaux dans les données produites.

Après notre simple exemple Java, nous avons examiné un aperçu des bibliothèques tierces disponibles.

L'exemple de code est disponible à l'adresse over sur GitHub.