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.