Introdução ao Apache Commons CSV

Introdução ao Apache Commons CSV

1. Visão geral

Apache Commons CSV library tem muitos recursos úteis para criar e ler arquivos CSV.

Neste tutorial rápido, veremos como utilizar esta biblioteca, mostrando um exemplo simples.

2. Dependência do Maven

Para começar, importaremos a versão mais recente desta biblioteca usando o Maven:


    org.apache.commons
    commons-csv
    1.4

Para verificar a versão mais recente desta biblioteca -go here.

3. Lendo um arquivo CSV

Considere o seguinte arquivo CSV chamado book.csv, que contém os atributos de um livro:

author,title
Dan Simmons,Hyperion
Douglas Adams,The Hitchhiker's Guide to the Galaxy

Vamos ver como podemos ler:

Map AUTHOR_BOOK_MAP = new HashMap<>() {
    {
        put("Dan Simmons", "Hyperion");
        put("Douglas Adams", "The Hitchhiker's Guide to the Galaxy");
    }
});
String[] HEADERS = { "author", "title"};

@Test
public void givenCSVFile_whenRead_thenContentsAsExpected() throws IOException {
    Reader in = new FileReader("book.csv");
    Iterable records = CSVFormat.DEFAULT
      .withHeader(HEADERS)
      .withFirstRecordAsHeader()
      .parse(in);
    for (CSVRecord record : records) {
        String author = record.get("author");
        String title = record.get("title");
        assertEquals(AUTHOR_BOOK_MAP.get(author), title);
    }
}

Estamos lendo os registros de um arquivo CSV depois de pular a primeira linha, pois é o cabeçalho.

Existem diferentes tipos deCSVFormat especificando o formato do arquivo CSV, um exemplo do qual você pode ver no próximo parágrafo.

4. Criação de um arquivo CSV

Vamos ver como podemos criar o mesmo arquivo CSV acima:

public void createCSVFile() throws IOException {
    FileWriter out = new FileWriter("book_new.csv");
    try (CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT
      .withHeader(HEADERS))) {
        AUTHOR_BOOK_MAP.forEach((author, title) -> {
            printer.printRecord(author, title);
        });
    }
}

O novo arquivo CSV será criado com os cabeçalhos apropriados porque os especificamos em nossa declaraçãoCSVFormat.

5. Cabeçalhos e colunas de leitura

Existem diferentes maneiras de ler e escrever cabeçalhos. Da mesma forma, existem diferentes maneiras de ler os valores das colunas.

Vamos examiná-los um por um:

5.1. Acessando Colunas por Índice

Essa é a maneira mais básica de ler os valores das colunas. Isso pode ser usado quando os cabeçalhos dos arquivos CSV não são conhecidos:

Reader in = new FileReader("book.csv");
Iterable records = CSVFormat.DEFAULT.parse(in);
for (CSVRecord record : records) {
    String columnOne = record.get(0);
    String columnTwo = record.get(1);
}

5.2. Acessando Colunas por Cabeçalhos Predefinidos

Essa é uma maneira mais intuitiva de acessar colunas quando comparada ao acesso por índices:

Iterable records = CSVFormat.DEFAULT
  .withHeader("author", "title").parse(in);
for (CSVRecord record : records) {
    String author = record.get("author");
    String title = record.get("title");
}

5.3. Usando Enums como Cabeçalhos

UsarStrings para acessar os valores da coluna pode estar sujeito a erros. Usar Enums em vez de Strings tornará o código mais padronizado e mais fácil de entender:

enum BookHeaders {
    author, title
}

Iterable records = CSVFormat.DEFAULT
  .withHeader(BookHeaders.class).parse(in);
for (CSVRecord record : records) {
    String author = record.get(BookHeaders.author);
    String title = record.get(BookHeaders.title);
}

5.4. Pulando a linha do cabeçalho

Geralmente, os arquivos CSV contêm cabeçalhos na primeira linha. Portanto, na maioria dos casos, é seguro ignorá-lo e começar a ler a partir da segunda linha.

Isso detectará automaticamente os cabeçalhos para acessar os valores da coluna:

Iterable records = CSVFormat.DEFAULT
  .withFirstRowAsHeader().parse(in);
for (CSVRecord record : records) {
    String author = record.get("author");
    String title = record.get("title");
}

5.5. Criando um arquivo com cabeçalhos

Da mesma forma, podemos criar um arquivo CSV com a primeira linha que contém os cabeçalhos:

FileWriter out = new FileWriter("book_new.csv");
CSVPrinter printer = CSVFormat.DEFAULT
  .withHeader("author", "title").print(out);

6. Conclusão

Apresentamos o uso da biblioteca Commons CSV do Apache por meio de um exemplo simples. Você pode ler mais sobre a bibliotecahere.

O código deste artigo está disponívelover on Github.