Как да пиша в CSV файл в Java

1. Общ преглед

В този кратък урок ще научим как да пишете в CSV файл с помощта на Java . CSV означава разделени със запетая стойности и това е често срещан формат за извършване на групов трансфер на данни между системи.

За да напишем нашия CSV файл, ще използваме класове в пакета java.io.

Ще говорим за специални знаци и как да се справим с тях. Ще насочим нашия изходен файл да се отваря в Microsoft Excel и Google Sheets.

След нашия пример за Java ще разгледаме накратко някои налични библиотеки на трети страни за работа с CSV файлове.

2. Писане с PrintWriter

Ще използваме PrintWriter за писане на нашия CSV файл. За по-подробен преглед на използването на java.io за запис във файл вижте нашата статия за писане във файлове.

2.1. Писане на CSV

Първо, нека създадем метод за форматиране на един ред данни, представен като масив от String s:

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

Преди да извикаме този метод обаче, нека следващото изграждане на някои примерни данни:

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\"" });

И с тези данни в ръка, нека преобразуваме всеки ред с convertToCSV и го запишем във файл:

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. Работа със специални символи

В CSV файл определени символи са проблематични и като разработчици рядко имаме пълен контрол върху качеството на нашите данни. Така че нека разгледаме сега как да боравим със специални знаци.

За нашия пример ще се съсредоточим върху запетаи, кавички и нови редове. Полетата, съдържащи запетаи или кавички, ще бъдат заобиколени от двойни кавички, а двойните кавички ще бъдат избегнати с двойни кавички. Ще премахнем нови редове и ще ги заменим с интервали.

Кои символи са проблем и как трябва да се обработват, може да варира в зависимост от случая на употреба.

Нашият метод convertToCSV извиква метода escapeSpecialCharacters за всяка част от данните, докато изгражда низ.

Нека внедрим нашия метод escapeSpecialCharacters сега:

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. Библиотеки на трети страни

Както видяхме с нашия пример, писането на CSV файл може да се усложни, когато започнем да мислим за специални символи и как да се справим с тях.

За наш късмет има много библиотеки на трети страни, налични за работа с CSV файлове и много от тях обработват тези специални знаци и други изключителни случаи, които могат да възникнат.

Нека да разгледаме няколко от тях:

  • Apache Commons CSV: CSV предложението на Apache за работа с CSV файлове
  • Open CSV: Друга популярна и активно поддържана CSV библиотека
  • Flatpack: Активно се разработва CSV библиотека с отворен код
  • CSVeed: Отворен код и се поддържа активно

4. Заключение

В тази бърза статия показахме как да напишем CSV файл, използвайки класа PrintWriter на Java . След това обсъдихме и обработихме специални символи в извежданите данни.

След нашия обикновен пример за Java, разгледахме преглед на наличните библиотеки на трети страни.

Примерният код е достъпен в GitHub.