Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Чтение и запись CSV на Java
Введение Это первая статья из короткой серии, посвященной библиотекам для чтения и записи CSV на Java [/ библиотеки-для-чтения-и-записи-csvs-in-java]. Чтение и запись CSV в Core Java Благодаря популярности и широкому использованию CSV в качестве формата для передачи данных существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java. Сторонние парсеры определяют общие форматы и могут работать с различными разделителями, обрабатывать специальные символы, а иногда даже читать не-b
Время чтения: 3 мин.
Вступление
Это первая статья из короткой серии, посвященной библиотекам для чтения и записи CSV на Java .
Чтение и запись CSV в Core Java
Благодаря популярности и широкому распространению CSV в качестве формата для передачи данных существует множество библиотек синтаксического анализатора, которые можно использовать вместе с Java.
Сторонние парсеры определяют общие форматы и могут работать с различными разделителями, обрабатывать специальные символы и иногда даже читать недвоичные данные. Однако не всем программам требуются все эти функции, поэтому по-прежнему важно иметь возможность обрабатывать файлы CSV с помощью ядра Java без использования каких-либо дополнительных библиотек.
Простая комбинация FileReader , BufferedReader и String.split() может облегчить чтение данных из CSV. Давайте рассмотрим шаги, чтобы открыть базовый файл CSV и проанализировать содержащиеся в нем данные:
- Используйте FileReader чтобы открыть файл CSV
- Создайте BufferedReader и прочитайте файл построчно, пока не будет достигнут символ «Конец файла» ( EOF).
- Используйте метод String.split() чтобы определить разделитель запятой и разделить строку на поля.
BufferedReader csvReader = new BufferedReader(new FileReader(pathToCsv)); while ((row = csvReader.readLine()) != null) < String[] data = row.split(","); // do something with the data >csvReader.close();
data будет содержать список полей в каждой строке файла, найденного в расположении файла pathToCsv Если в CSV-файле есть разделитель, отличный от запятой, его можно указать в методе split Например, еще одним распространенным разделителем является вкладка для файлов TSV (Tab-Separated-Value).
Данные могут быть переданы в отдельный метод для обработки или записи в базу данных из цикла или сохранены в коллекции Java для дальнейшего использования. Например, если вы записываете большой объем данных в базу данных, нарушений ограничений (например, нарушений первичного ключа), вызванных человеческими ошибками при создании CSV, можно избежать с помощью хэш-карты. Если в CSV есть повторяющаяся запись, хэш-карта сохранит самое последнее «прочитанное» и перезапишет предыдущую запись.
Поскольку вы пишете синтаксический анализатор с нуля, вам необходимо самостоятельно позаботиться о простой обработке ошибок. Например, если вы не уверены, существует ли файл, всегда безопаснее заключить операцию чтения в блок try/catch или добавить логику для определения существования файла перед обработкой.
Чтобы проверить, существует ли файл, в наш код можно внести следующие изменения:
File csvFile = new File(pathToCsv); if (csvFile.isFile()) < // create BufferedReader and read data from csv >
С некоторой простой обработкой ошибок и строгими требованиями к формату CSV создание простого анализатора самостоятельно с использованием основных компонентов Java — задача, которую может взять на себя большинство программистов.
Написание CSV на Core Java
Большинство сторонних парсеров также поддерживают запись в файлы CSV. Однако есть простой способ записи в файлы CSV, как и в файлы любого другого типа, без использования каких-либо библиотек.
Самый простой способ — использовать FileWriter и обрабатывать файл CSV как любой другой текстовый файл. В нашем примере данные хранятся в некоторых List , которые мы просто перебираем и добавляем в средство записи:
// Our example data List> rows = Arrays.asList( Arrays.asList("Jean", "author", "Java"), Arrays.asList("David", "editor", "Python"), Arrays.asList("Scott", "editor", "Node.js") ); FileWriter csvWriter = new FileWriter("new.csv"); csvWriter.append("Name"); csvWriter.append(","); csvWriter.append("Role"); csvWriter.append(","); csvWriter.append("Topic"); csvWriter.append("\n"); for (List rowData : rows) < csvWriter.append(String.join(",", rowData)); csvWriter.append("\n"); >csvWriter.flush(); csvWriter.close();
При использовании FileWriter всегда убеждайтесь, что вы сбрасываете и закрываете поток. Это улучшает производительность операции ввода-вывода и указывает на то, что в выходной поток больше нет данных для записи.
Заключение
Существует несколько способов чтения и записи файлов CSV в Java, самый простой из которых — использовать компоненты Core Java. Хотя это также делает вас более уязвимым для ошибок и будет менее надежным, чем проверенное стороннее решение.
Если вам интересно узнать о других способах чтения и записи CSV на Java, обязательно ознакомьтесь с другими нашими статьями:
- Чтение и запись CSV на Java с помощью Apache Commons CSV
- Чтение и запись CSV на Java с OpenCSV
Licensed under CC BY-NC-SA 4.0
Как в Java записать данные в файл .csv?
Здравствуйте! Пытаюсь записать данные из таблицы (фото 1) в приложении в файл формата csv. Вроде в txt всё записывается хорошо, однако в csv получается бред (фото 2). Как можно изменить код, чтобы записывалась всё без сдвигов? Есть ли возможность в файле csv дать имя столбцам? Прикрепляю свой кусок кода:
@Override public void actionPerformed(ActionEvent event) < //JOptionPane.showMessageDialog(save, "Check Save"); FileDialog save = new FileDialog(bookList, "Сохранение данных", FileDialog.SAVE); save.setFile("*.csv"); save.setVisible(true); // Отобразить запрос пользователю // Определить имя выбранного каталога и файла String fileName = save.getDirectory() + save.getFile(); try < BufferedWriter writer = new BufferedWriter(new FileWriter(fileName)); for (int i = 0; i < model.getRowCount(); i++) < // Для всех строк for (int j = 0; j < 4; j++) // Для всех столбцов < System.out.println((String) model.getValueAt(i, j) + "; "); writer.write((String) model.getValueAt(i, j) + "; "); // Записать значение из ячейки //writer.write(" "); // Записать символ перевода каретки writer.write("\n"); // Записать символ перевода каретки >writer.write("\n"); // Записать символ перевода каретки > writer.close(); > catch (IOException e) // Ошибка записи в файл

- Вопрос задан более года назад
- 542 просмотра
Как записать данные в CSV-файл на Java
В этой статье показано, как записывать данные в значения, разделенные запятыми (CSV) файл.
- OpenCSV – Запись данных в CSV-файл
- Средство записи CSV одного класса – Запись данных в файл CSV
- Средство записи CSV одного класса – Модульные тесты
Примечание RFC 4180 определяет формат или определения файла CSV или текстового/csv файла.
1. OpenCSV – Запись данных в CSV-файл
1.1 В OpenCSV – это простой в использовании анализатор и средство записи CSV.
com.opencsv opencsv 5.3
1.2 Это OpenCSV пример использует Средство записи CSV для записи списка <Строка[]>в файл.
package com.mkyong.io.csv.opencsv; import com.opencsv.CSVWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class OpenCsvWriterExample < public static void main(String[] args) throws IOException < ListcsvData = createCsvDataSimple(); // default all fields are enclosed in double quotes // default separator is a comma try (CSVWriter writer = new CSVWriter(new FileWriter("c:\\test\\test.csv"))) < writer.writeAll(csvData); >> private static List createCsvDataSimple() < String[] header = ; String[] record1 = ; String[] record2 = ; List list = new ArrayList<>(); list.add(header); list.add(record1); list.add(record2); return list; > >
Просмотрите только что созданный CSV-файл. По умолчанию все поля заключены в двойные кавычки, а разделителем по умолчанию является запятая.
"id","name","address","phone" "1","first name","address 1","11111" "2","second name","address 2","22222"
1.3 Это Пример Opencv показывает использование пользовательского разделителя, точки с запятой ; .
try (ICSVWriter writer = new CSVWriterBuilder( new FileWriter(«c:\\test\\test.csv»)) .withSeparator(‘;’) .build())
"id";"name";"address";"phone" "1";"first name";"address 1";"11111" "2";"second name";"address 2";"22222"
1.4 Это Opencv пример проверки распространенных встроенных проблем в CSV–файлах – встроенные запятые, двойные кавычки и разрывы строк. Прочитайте RFC 4180 .
package com.mkyong.io.csv.opencsv; import com.opencsv.CSVWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class OpenCsvWriterExample < public static void main(String[] args) throws IOException < ListcsvData = createCsvDataSpecial(); // default all fields are enclosed in double quotes // default separator is a comma try (CSVWriter writer = new CSVWriter(new FileWriter("c:\\test\\monitor.csv"))) < writer.writeAll(csvData); >> private static List createCsvDataSpecial() < String[] header = ; String[] record1 = ; // embedded double quotes String[] record2 = ; // embedded double quotes and commas String[] record3 = ; // embedded line break String[] record4 = ; List list = new ArrayList<>(); list.add(header); list.add(record1); list.add(record2); list.add(record3); list.add(record4); return list; > >
Просмотрите содержимое файла CSV. Все встроенные запятые, двойные кавычки и разрывы строк заключены в двойные кавычки.
"Make","Model","Description","Price" "Dell","P3421W","Dell 34, Curved, USB-C Monitor","2499.00" "Dell","","Alienware 38 Curved ""Gaming Monitor""","6699.00" "Samsung","","49"" Dual QHD, QLED, HDR1000","6199.00" "Samsung","","Promotion! Special Price 49"" Dual QHD, QLED, HDR1000","4999.00"
Дальнейшее чтение Прочтите это Пример Opencv для чтения или анализа CSV-файла
2. Средство записи CSV одного класса – Запись данных в файл CSV
2.1 Библиотека OpenCSV хороша, но она содержит много зависимостей , что позволяет мне задаться вопросом, действительно ли нам нужна сторонняя библиотека для записи данных в файл CSV, это зависит от ваших предпочтений.
2.2 Однако ниже приведена моя реализация записи CSV для одного класса. Он поддерживает пользовательский разделитель и заботится о встроенных запятых, двойных кавычках и разрывах строк. Прочитайте комментарии к коду для пояснения. Ключ находится в методе formatCsvField (последнее строковое поле, окончательная логическая кавычка) , который определяет, как форматировать поля CSV.
package com.mkyong.io.csv; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class CsvWriterSimple < private static final String COMMA = ","; private static final String DEFAULT_SEPARATOR = COMMA; private static final String DOUBLE_QUOTES = "\""; private static final String EMBEDDED_DOUBLE_QUOTES = "\"\""; private static final String NEW_LINE_UNIX = "\n"; private static final String NEW_LINE_WINDOWS = "\r\n"; public static void main(String[] args) throws IOException < CsvWriterSimple writer = new CsvWriterSimple(); writer.writeToCsvFile(createCsvDataSpecial(), new File("c:\\test\\monitor.csv")); >public String convertToCsvFormat(final String[] line) < return convertToCsvFormat(line, DEFAULT_SEPARATOR); >public String convertToCsvFormat(final String[] line, final String separator) < return convertToCsvFormat(line, separator, true); >// if quote = true, all fields are enclosed in double quotes public String convertToCsvFormat( final String[] line, final String separator, final boolean quote) < return Stream.of(line) // convert String[] to stream .map(l ->formatCsvField(l, quote)) // format CSV field .collect(Collectors.joining(separator)); // join with a separator > // put your extra login here private String formatCsvField(final String field, final boolean quote) < String result = field; if (result.contains(COMMA) || result.contains(DOUBLE_QUOTES) || result.contains(NEW_LINE_UNIX) || result.contains(NEW_LINE_WINDOWS)) < // if field contains double quotes, replace it with two double quotes \"\" result = result.replace(DOUBLE_QUOTES, EMBEDDED_DOUBLE_QUOTES); // must wrap by or enclosed with double quotes result = DOUBLE_QUOTES + result + DOUBLE_QUOTES; >else < // should all fields enclosed in double quotes if (quote) < result = DOUBLE_QUOTES + result + DOUBLE_QUOTES; >> return result; > // a standard FileWriter, CSV is a normal text file private void writeToCsvFile(List list, File file) throws IOException < Listcollect = list.stream() .map(this::convertToCsvFormat) .collect(Collectors.toList()); // CSV is a normal text file, need a writer try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) < for (String line : collect) < bw.write(line); bw.newLine(); >> > private static List createCsvDataSpecial() < String[] header = ; String[] record1 = ; String[] record2 = ; String[] record3 = ; String[] record4 = ; List list = new ArrayList<>(); list.add(header); list.add(record1); list.add(record2); list.add(record3); list.add(record4); return list; > >
Просмотрите содержимое файла CSV. Встроенные запятые, двойные кавычки и разрывы строк правильно заключены в двойные кавычки. Результат такой же, как и выше Пример Opencv 1.4.
"Make","Model","Description","Price" "Dell","P3421W","Dell 34, Curved, USB-C Monitor","2499.00" "Dell","","Alienware 38 Curved ""Gaming Monitor""","6699.00" "Samsung","","49"" Dual QHD, QLED, HDR1000","6199.00" "Samsung","","Promotion! Special Price 49"" Dual QHD, QLED, HDR1000","4999.00"
3. Средство записи CSV одного класса – Модульные тесты
Вот несколько модульных тестов для вышеупомянутого CSVWriter Simple .
package com.mkyong.io.csv; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class CsvWriterSimpleTest < private CsvWriterSimple writer = new CsvWriterSimple(); @Test void test_convert_csv_line_default() < String[] record = ; String expected = "\"1\",\"apple\",\"10\",\"9.99\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); > @Test void test_convert_csv_line_empty() < String[] record = ; String expected = "\"1\",\"\",\"10\",\"\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); > @Test void test_convert_csv_line_custom_separator() < String[] record = ; String expected = "\"1\";\"apple\";\"10\";\"9.99\""; String result = writer.convertToCsvFormat(record, ";"); assertEquals(expected, result); > @Test void test_convert_csv_line_no_quoted() < String[] record = ; String expected = "1,apple,10,9.99"; String result = writer.convertToCsvFormat(record, ",", false); assertEquals(expected, result); > @Test void test_convert_csv_line_contains_comma() < String[] record = ; String expected = "\"1\",\"apple,orange\",\"10\",\"9.99\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); > @Test void test_convert_csv_line_contains_double_quotes() < String[] record = ; String expected = "\"1\",\"12\"\"apple\",\"10\",\"9.99\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); > @Test void test_convert_csv_line_contains_newline() < String[] record = ; String expected = "\"1\",\"promotion!\napple\",\"10\",\"9.99\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); > >
P.S Дайте мне знать, если вы обнаружили ошибки в CSVWriter Простой .
Дальнейшее чтение Как читать и анализировать CSV-файл на Java
Скачать Исходный Код
Рекомендации
- RFC 4180 (RFC 4180)
- Википедия – Значения, разделенные запятыми (CSV)
- OpenCSV Вебсайт
- Как читать и анализировать CSV-файл на Java
Чтение и запись CSV файла с помощью SuperCSV в Java

В этой статье мы рассмотрим простой способ обработки CSV файлов c помощью библиотеки Super CSV. На простых примерах научимся парсить (считывать) данные и создавать новые CSV файлы. Недавно мы рассматривали простой способ обработки CSV в Java без использования сторонней библиотеки — Как читать CSV файл в Java: задавали разделитесь и считывали информацию с помощью класса Scanner. Но как быть с созданием новых CSV файлов, элементарной поддержкой кодировки, обработки спецсимволов? Для этого есть библиотека SuperCSV — быстрый, удобный и бесплатный инструмент для обработки CSV в Java.
Краткий обзор библиотеки Super CSV
- SuperCSV берет на себя работу с кодировкой, правильной обработкой запятых, кавычек, пробелов и escape-последовательностей согласно спецификации CSV.
- SuperCSV позволяет разработчику использовать свой собственный разделитель или просто выбрать одну из предопределенных конфигураций, включая запятые, табуляцию, точку с запятой и другие.
- SuperCSV работает с потоками, то есть дает максимальный контроль ввода/вывода при работе с CSV.
- SuperCSV позволяет быстро и удобно парсить дату, применять форматирование, а также использовать регулярные выражения для преобразования значений.
В примере ниже мы парсим CSV-файл и преобразовываем считанную информацию в список объектов Java. Также мы рассмотрим быстрый способ создания нового CSV файла в Java.
Читаем CSV файл с помощью библиотеки SuperCSV
Создадим файл test.csv с таким наполнением:
