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<String[]> 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 : предложение Apache CSV для работы с CSV-файлами.
- Open CSV : еще одна популярная и активно поддерживаемая библиотека CSV.
- Flatpack : Активно разрабатываемая библиотека CSV с открытым исходным кодом.
- CSVeed : с открытым исходным кодом и активно поддерживается
4. Вывод
В этой краткой статье мы обсудили, как написать файл CSV с помощью класса Java PrintWriter .
Далее мы обсудили и обработали специальные символы в выводимых данных.
После нашего простого примера с Java мы рассмотрели обзор доступных сторонних библиотек.
Пример кода доступен на GitHub.