Рубрики
Без рубрики

Как записать данные в CSV-файл на Java

– Как записать данные в CSV-файл на Java

В этой статье показано, как записывать данные в значения, разделенные запятыми (CSV) файл.

Темы:

  1. OpenCSV – Запись данных в CSV-файл
  2. Средство записи CSV одного класса – Запись данных в файл CSV
  3. Средство записи 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 {

        List csvData = 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 {

        List csvData = 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(List list, 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

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-export-data-to-csv-file-java/”