Como ler arquivos CSV em java
Existem várias formas de ler arquivos CSV em Java. A forma mais "raiz" é lendo o arquivo e fazendo Split, por espaço, vírgula ou ponto-e-vírgula, mas pra quê reinventar a roda né? Tem bibliotecas open-source que fazem todo o trabalho pra gente.
Neste post vamos ver como ler arquivos CSV em java com a biblioteca open-source OpenCSV.
>> Como escrever arquivos CSV em java
CSV de exemplo
Para os exemplos destes post, vamos usar um CSV simples. Considere que o arquivo pessoas.csv
esteja em algum lugar acessível pela sua classe, ou seja no classpath
, e tenha este conteúdo:
nome,idade,email
Gustavo,28,gustavo@dicasdeprogramcao.com.br
Joao,35,joao@dicasdejava.com.br
Maria,23,maria@dicasdeprogramacao.com.br
Ana,25,ana@dicasdejava.com.br
OpenCSV como dependência (maven)
Para utilizar o OpenCSV você precisa importá-lo como dependência no seu projeto. Se você estiver utilizando o Maven, basta adicionar a seguinte dependência no seu arquivo pom.xml
.
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.2</version>
</dependency>
Lendo CSV como uma lista de String[]
Uma forma simples de ler um CSV é como uma lista de arrays de String, ou seja: List<String[]>
. Veja no código abaixo como fazer isso com o OpenCSV.
package br.com.dicasdejava.util.csv;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class LerLinhasOpenCsv {
public static void main(String[] args) throws IOException {
Reader reader = Files.newBufferedReader(Paths.get("pessoas.csv"));
CSVReader csvReader = new CSVReaderBuilder(reader).withSkipLines(1).build();
List<String[]> pessoas = csvReader.readAll();
for (String[] pessoa : pessoas)
System.out.println("Name : " + pessoa[0] +
" - Idade : " + pessoa[1] +
" - Email : " + pessoa[2]);
}
}
Saída:
Name : Gustavo - Idade : 28 - Email : gustavo@dicasdeprogramcao.com.br
Name : Joao - Idade : 35 - Email : joao@dicasdejava.com.br
Name : Maria - Idade : 23 - Email : maria@dicasdeprogramacao.com.br
Name : Ana - Idade : 25 - Email : ana@dicasdejava.com.br
Lendo CSV como um objeto
Outra forma interessante de ler um CSV é obter uma lista de Objetos de uma Classe que representa um registro do csv.
Para isto, vamos criar a classe CsvPessoa com os atributos contidos no CSV.
É importante que os nomes dos atributos sejam iguais as colunas do CSV.
package br.com.dicasdejava.csv;
public class CsvPessoa {
private String nome;
private Integer idade;
private String email;
// Gets e Sets omitidos para ficar menor
public String toString() {
return "CsvPessoa{nome='" + nome + "\', idade=" + idade + ", email='" + email + "\'}";
}
}
Agora vamos ler o CSV e obter uma lista de pessoas, ou seja: List<Pessoa>
package br.com.dicasdejava.csv;
import br.com.dicasdejava.model.CsvPessoa;
import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.CsvToBeanBuilder;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class LerLinhasComoObjetosOpenCsv {
public static void main(String[] args) throws IOException {
Reader reader = Files.newBufferedReader(Paths.get("pessoas.csv"));
CsvToBean<CsvPessoa> csvToBean = new CsvToBeanBuilder(reader)
.withType(CsvPessoa.class)
.build();
List<CsvPessoa> pessoas = csvToBean.parse();
for (CsvPessoa pessoa : pessoas)
System.out.println(pessoa);
}
}
Saída:
CsvPessoa{nome='Gustavo', idade=28, email='gustavo@dicasdeprogramcao.com.br'}
CsvPessoa{nome='Joao', idade=35, email='joao@dicasdejava.com.br'}
CsvPessoa{nome='Maria', idade=23, email='maria@dicasdeprogramacao.com.br'}
CsvPessoa{nome='Ana', idade=25, email='ana@dicasdejava.com.br'}