Перейти к основному содержимому

Как записать файл CSV в Java

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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.