Введение в OpenCSV

Введение в OpenCSV

1. Вступление

Эта краткая статья знакомит с OpenCSV 4, фантастической библиотекой для записи, чтения, сериализации, десериализации и / или анализа файлов.csv! Ниже мы рассмотрим несколько примеров, демонстрирующих, как настроить и использовать OpenCSV 4 для ваших усилий.

2. Настроить

Вот как добавить OpenCSV в ваш проект через зависимостьpom.xml:


    com.opencsv
    opencsv
    4.1

.jars для OpenCSV можно найти вofficial site или с помощью быстрого поиска вMaven Repository.

Наш файл.csv будет очень простым, мы сохраним его в два столбца и четыре строки:

colA, ColB
A, B
C, D
G, G
G, F

3. Бин или не Бин

После добавления OpenCSV в вашpom.xml мы можем реализовать методы обработки CSV двумя удобными способами:

  1. используя удобные объектыCSVReader иCSVWriter (для более простых операций) или

  2. использованиеCsvToBean для преобразования файлов.csv в beans (которые реализованы как аннотированныеplain-old-java-objects).

В этой статье мы будем использовать примерыsynchronous (илиblocking), чтобы сосредоточиться на основах.

Помните, что методsynchronous предотвратит выполнение окружающего или последующего кода, пока он не будет выполнен. Любая производственная среда, скорее всего, будет использовать методыasynchronous или (non-blocking), которые позволят другим процессам или методам завершиться, пока методasynchronous завершится.

Мы рассмотрим примерыasynchronous для OpenCSV в следующей статье.

3.1. CSVReader

CSVReader - с помощью предоставленных методовreadAll() иreadNext()! Давайте посмотрим, как использоватьreadAll () синхронно:

public List readAll(Reader reader) throws Exception {
    CSVReader csvReader = new CSVReader(reader);
    List list = new ArrayList<>();
    list = csvReader.readAll();
    reader.close();
    csvReader.close();
    return list;
}

Затем мы можем вызвать этот метод, передавBufferedReader:

public String readAllExample() throws Exception {
    Reader reader = Files.newBufferedReader(Paths.get(
      ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()));
    return CsvReaderExamples.readAll(reader).toString();
}

Точно так же мы можем абстрагироваться отreadNext (), который считывает предоставленный.csv построчно:

public List oneByOne(Reader reader) throws Exception {
    List list = new ArrayList<>();
    CSVReader csvReader = new CSVReader(reader);
    String[] line;
    while ((line = csvReader.readNext()) != null) {
        list.add(line);
    }
    reader.close();
    csvReader.close();
    return list;
}

И мы можем вызвать этот метод здесь, передавBufferReader:

public String oneByOneExample() throws Exception {
    Reader reader = Files.newBufferedReader(Paths.get(
      ClassLoader.getSystemResource("csv/twoColumn.csv").toURI()));
    return CsvReaderExamples.oneByOne(reader).toString();
}

Для большей гибкости и возможностей конфигурации вы также можете использоватьCSVReaderBuilder:

CSVParser parser = new CSVParserBuilder()
    .withSeparator(',')
    .withIgnoreQuotations(true)
    .build();

CSVReader csvReader = new CSVReaderBuilder(reader)
    .withSkipLines(0)
    .withCSVParser(parser)
    .build();

CSVReaderBuilder позволяет пропустить заголовки столбцов и установить правила синтаксического анализа черезCSVParserBuilder.

ИспользуяCSVParserBuilder, мы можем выбрать собственный разделитель столбцов, игнорировать или обрабатывать кавычки, указывать, как мы будем обрабатывать пустые поля и как интерпретировать экранированные символы. Дополнительные сведения об этих параметрах конфигурации см. В официальной спецификацииdocs.

Как всегда, не забудьте закрыть всеReaders, чтобы предотвратить утечку памяти!

3.2. CSVWriter

CSVWriter аналогичным образом предоставляет возможность записи в файл.csv сразу или построчно.

Давайте посмотрим, как выполнять запись в.csv построчно:

public String csvWriterOneByOne(List stringArray, Path path) throws Exception {
    CSVWriter writer = new CSVWriter(new FileWriter(path.toString()));
    for (String[] array : stringArray) {
        writer.writeNext(array);
    }

    writer.close();
    return Helpers.readFile(path);
}

Теперь давайте укажем, где мы хотим сохранить этот файл, и вызовем только что написанный нами метод:

public String csvWriterOneByOne() throws Exception{
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/writtenOneByOne.csv").toURI());
    return CsvWriterExamples.csvWriterOneByOne(Helpers.fourColumnCsvString(), path);
}

Мы также можем записать наш.csv сразу, передавList из массивовString, представляющих строки нашего.csv. :

public String csvWriterAll(List stringArray, Path path) throws Exception {
     CSVWriter writer = new CSVWriter(new FileWriter(path.toString()));
     writer.writeAll(stringArray);
     writer.close();
     return Helpers.readFile(path);
}

А вот как мы это называем:

public String csvWriterAll() throws Exception {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/writtenAll.csv").toURI());
    return CsvWriterExamples.csvWriterAll(Helpers.fourColumnCsvString(), path);
}

Это оно!

3.3. Чтение на основе фасоли

OpenCSV может сериализовать файлы.csv в заранее заданные и повторно используемые схемы, реализованные как аннотированные Java-биныpojo. CsvToBean строится с использованиемCsvToBeanBuilder. Начиная с OpenCSV 4,CsvToBeanBuilder является рекомендуемым способом работы сcom.opencsv.bean.CsvToBean.

Вот простой bean-компонент, который мы можем использовать для сериализации нашего двухколоночного.csv изsection 2.:

public class SimplePositionBean  {
    @CsvBindByPosition(position = 0)
    private String exampleColOne;

    @CsvBindByPosition(position = 1)
    private String exampleColTwo;

    // getters and setters
}

Каждый столбец в файле.csv связан с полем в компоненте. Сопоставления между заголовками столбцов.csv могут выполняться с использованием аннотаций@CsvBindByPosition или@CsvBindByName, которые определяют сопоставление по позиции или совпадению строки заголовка соответственно.

Во-первых, давайте создадим суперкласс под названием CsvBean - это позволит нам повторно использовать и обобщать методы, которые мы создадим ниже:

public class CsvBean { }

Пример дочернего класса:

public class NamedColumnBean extends CsvBean {

    @CsvBindByName(column = "name")
    private String name;

    @CsvBindByName
    private int age;

    // getters and setters
}

Давайте абстрагируем синхронно возвращаемыйList, используяCsvToBean:

 public List beanBuilderExample(Path path, Class clazz) throws Exception {
     CsvTransfer csvTransfer = new CsvTransfer();
     ColumnPositionMappingStrategy ms = new ColumnPositionMappingStrategy();
     ms.setType(clazz);

     Reader reader = Files.newBufferedReader(path);
     CsvToBean cb = new CsvToBeanBuilder(reader)
       .withType(clazz)
       .withMappingStrategy(ms)
       .build();

    csvTransfer.setCsvList(cb.parse());
    reader.close();
    return csvTransfer.getCsvList();
}

Мы передаем наш bean-компонент (clazz) и устанавливаем его какColumnPositionMappingStrategy. При этом мы связываем поля наших bean-компонентов с соответствующими столбцами наших строк.csv.

Мы можем вызвать это здесь, используя подклассSimplePositionBean классаCsvBean, который мы написали выше:

public String simplePositionBeanExample() throws Exception {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/twoColumn.csv").toURI());
    return BeanExamples.beanBuilderExample(path, SimplePositionBean.class).toString();
}

или здесь, используяNamedColumnBean – другой подклассCsvBean:

public String namedColumnBeanExample() throws Exception {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/namedColumn.csv").toURI());
    return BeanExamples.beanBuilderExample(path, NamedColumnBean.class).toString();
}

3.4. Написание бина

Наконец, давайте посмотрим, как использовать классStatefulBeanToCsv для записи в файл.csv:

public String writeCsvFromBean(Path path) throws Exception {
    Writer writer  = new FileWriter(path.toString());

    StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(writer)
       .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
       .build();

    List list = new ArrayList<>();
    list.add(new WriteExampleBean("Test1", "sfdsf", "fdfd"));
    list.add(new WriteExampleBean("Test2", "ipso", "facto"));

    sbc.write(list);
    writer.close();
    return Helpers.readFile(path);
}

Здесь мы указываем, как мы будем разграничивать наши данные, которые предоставляются какList указанных объектовCsvBean.

Затем мы можем вызвать наш методwriteCsvFromBean() после передачи желаемого пути к выходному файлу:

public String writeCsvFromBeanExample() {
    Path path = Paths.get(
      ClassLoader.getSystemResource("csv/writtenBean.csv").toURI());
    return BeanExamples.writeCsvFromBean(path);
}

4. Заключение

Итак, примеры синхронного кода дляOpenCSV с использованием beans,CSVReader иCSVWriter. Ознакомьтесь с официальной документациейhere.

Как всегда, образцы кода предоставляютсяover on GitHub.