В этой статье показано, как записывать данные в значения, разделенные запятыми (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 = {"id", "name", "address", "phone"}; String[] record1 = {"1", "first name", "address 1", "11111"}; String[] record2 = {"2", "second name", "address 2", "22222"}; 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()) { writer.writeAll(csvData); }
Выход
"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 = {"Make", "Model", "Description", "Price"}; String[] record1 = {"Dell", "P3421W", "Dell 34, Curved, USB-C Monitor", "2499.00"}; // embedded double quotes String[] record2 = {"Dell", "", "Alienware 38 Curved \"Gaming Monitor\"", "6699.00"}; // embedded double quotes and commas String[] record3 = {"Samsung", "", "49\" Dual QHD, QLED, HDR1000", "6199.00"}; // embedded line break String[] record4 = {"Samsung", "", "Promotion! Special Price\n49\" Dual QHD, QLED, HDR1000", "4999.00"}; 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(Listlist, File file) throws IOException { List collect = 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 = {"Make", "Model", "Description", "Price"}; String[] record1 = {"Dell", "P3421W", "Dell 34, Curved, USB-C Monitor", "2499.00"}; String[] record2 = {"Dell", "", "Alienware 38 Curved \"Gaming Monitor\"", "6699.00"}; String[] record3 = {"Samsung", "", "49\" Dual QHD, QLED, HDR1000", "6199.00"}; String[] record4 = {"Samsung", "", "Promotion! Special Price\n49\" Dual QHD, QLED, HDR1000", "4999.00"}; 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 = {"1", "apple", "10", "9.99"}; String expected = "\"1\",\"apple\",\"10\",\"9.99\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); } @Test void test_convert_csv_line_empty() { String[] record = {"1", "", "10", ""}; String expected = "\"1\",\"\",\"10\",\"\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); } @Test void test_convert_csv_line_custom_separator() { String[] record = {"1", "apple", "10", "9.99"}; 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 = {"1", "apple", "10", "9.99"}; 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 = {"1", "apple,orange", "10", "9.99"}; 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 = {"1", "12\"apple", "10", "9.99"}; 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 = {"1", "promotion!\napple", "10", "9.99"}; String expected = "\"1\",\"promotion!\napple\",\"10\",\"9.99\""; String result = writer.convertToCsvFormat(record); assertEquals(expected, result); } }
P.S Дайте мне знать, если вы обнаружили ошибки в CSVWriter Простой .
Дальнейшее чтение Как читать и анализировать CSV-файл на Java
Скачать Исходный Код
$клон git $клон git
$cd java-ввод-вывод/csv
Рекомендации
- RFC 4180 (RFC 4180)
- Википедия – Значения, разделенные запятыми (CSV)
- OpenCSV Вебсайт
- Как читать и анализировать CSV-файл на Java
Оригинал: “https://mkyong.com/java/how-to-export-data-to-csv-file-java/”