Introdução ao OpenCSV

Introdução ao OpenCSV

1. Introdução

Este artigo rápido apresenta o OpenCSV 4, uma biblioteca fantástica para escrever, ler, serializar, desserializar e / ou analisar arquivos.csv! Abaixo, veremos vários exemplos que demonstram como configurar e usar o OpenCSV 4 para seus empreendimentos.

2. Configuração

Veja como adicionar OpenCSV ao seu projeto por meio de uma dependênciapom.xml:


    com.opencsv
    opencsv
    4.1

O.jars para OpenCSV pode ser encontrado emofficial site ou por meio de uma pesquisa rápida emMaven Repository.

Nosso arquivo.csv será muito simples, vamos mantê-lo em duas colunas e quatro linhas:

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

3. Bean ou não Bean

Depois de adicionar OpenCSV ao seupom.xml, podemos implementar métodos de manipulação de CSV de duas maneiras convenientes:

  1. usando os objetos úteisCSVReadereCSVWriter (para operações mais simples) ou

  2. usandoCsvToBean para converter arquivos.csv em beans (que são implementados comoplain-old-java-objects anotados).

Continuaremos comsynchronous (oublocking) exemplos para este artigo para que possamos nos concentrar no básico.

Lembre-se, um métodosynchronous impedirá que o código adjacente ou subsequente seja executado até que seja feito. Qualquer ambiente de produção provavelmente usará métodosasynchronous ou (non-blocking) que permitirão que outros processos ou métodos sejam concluídos enquanto o métodoasynchronous termina.

Vamos mergulhar nos exemplos deasynchronous para OpenCSV em um artigo futuro.

3.1. OCSVReader

CSVReader - por meio dos métodosreadAll()ereadNext() fornecidos! Vamos dar uma olhada em como usarreadAll () de forma síncrona:

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;
}

Então, podemos chamar esse método passando umBufferedReader:

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

Da mesma forma, podemos abstrairreadNext () que lê um.csv fornecido linha por linha:

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;
}

E podemos chamar esse método aqui, passando umBufferReader:

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

Para maior flexibilidade e opções de configuração, você pode usarCSVReaderBuilder alternativamente:

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

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

CSVReaderBuilder permite pular os títulos das colunas e definir regras de análise por meio deCSVParserBuilder.

UsandoCSVParserBuilder, podemos escolher um separador de coluna personalizado, ignorar ou lidar com aspas, definir como lidaremos com campos nulos e como interpretar caracteres de escape. Para obter mais informações sobre essas configurações, consulte as especificações oficiaisdocs.

Como sempre, lembre-se de fechar todos os seusReaders para evitar vazamentos de memória!

3.2. OCSVWriter

CSVWriter fornece a capacidade de gravar em um arquivo.csv de uma vez ou linha por linha.

Vamos dar uma olhada em como escrever em.csv linha por linha:

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);
}

Agora, vamos especificar onde queremos salvar esse arquivo e chamar o método que acabamos de escrever:

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

Também podemos escrever nosso.csv de uma vez, passando umList deString arrays representando as linhas de nosso.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);
}

E é assim que o chamamos:

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

É isso aí!

3.3. Leitura Baseada em Feijão

O OpenCSV é capaz de serializar arquivos.csv em esquemas predefinidos e reutilizáveis ​​implementados como beans Javapojo anotados. CsvToBean é construído usandoCsvToBeanBuilder. No OpenCSV 4,CsvToBeanBuilder é a forma recomendada para trabalhar comcom.opencsv.bean.CsvToBean.

Aqui está um bean simples que podemos usar para serializar nosso.csv de duas colunas desection 2.:

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

    @CsvBindByPosition(position = 1)
    private String exampleColTwo;

    // getters and setters
}

Cada coluna no arquivo.csv está associada a um campo no bean. Os mapeamentos entre os cabeçalhos de coluna.csv podem ser executados usando as anotações@CsvBindByPosition ou@CsvBindByName que especificam um mapeamento por posição ou correspondência de sequência de cabeçalho, respectivamente.

Primeiro, vamos criar uma superclasse chamada CsvBean - isso nos permitirá reutilizar e generalizar os métodos que construiremos abaixo:

public class CsvBean { }

Um exemplo de classe filho:

public class NamedColumnBean extends CsvBean {

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

    @CsvBindByName
    private int age;

    // getters and setters
}

Vamos abstrair umList retornado de forma síncrona usando oCsvToBean:

 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();
}

Passamos nosso bean (clazz) e o definimos comoColumnPositionMappingStrategy. Ao fazer isso, associamos os campos de nossos grãos às respectivas colunas de nossas linhas.csv.

Podemos chamar isso aqui usando a subclasseSimplePositionBean deCsvBean que escrevemos acima:

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

ou aqui usandoNamedColumnBean – outra subclasse deCsvBean:

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

3.4. Escrita baseada em bean

Por último, vamos dar uma olhada em como usar a classeStatefulBeanToCsv para gravar em um arquivo.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);
}

Aqui, estamos especificando como delimitaremos nossos dados, que são fornecidos comoList de objetosCsvBean especificados.

Podemos então chamar nosso métodowriteCsvFromBean() depois de passar o caminho do arquivo de saída desejado:

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

4. Conclusão

Lá vamos nós - exemplos de código síncrono paraOpenCSV usando beans,CSVReader eCSVWriter. Confira os documentos oficiaishere.

Como sempre, as amostras de código são fornecidasover on GitHub.