Texto de: Geraldo Daros
Introdução
Os arquivos CSV (Comma-Separated Values) são amplamente utilizados para armazenar dados de forma simples e legível em planilhas. Neste artigo, vamos explorar como manipular arquivos CSV em Java usando as classes da biblioteca padrão e também bibliotecas externas que facilitam ainda mais o processo.
Formato CSV
Um arquivo CSV armazena dados em formato de texto, com valores separados por vírgulas (ou outro delimitador). Normalmente, cada linha do arquivo representa um registro, e cada valor separado representa um campo. Por exemplo:
Nome,Idade,Cidade
Ana,25,São Paulo
Carlos,30,Rio de Janeiro
Julia,22,Belo Horizonte
Para manipular arquivos CSV em Java, podemos optar por usar o pacote java.io
e o java.nio.file
para fazer operações básicas de leitura e escrita. Entretanto, algumas bibliotecas populares facilitam essa manipulação com funcionalidades específicas para CSV.
Vamos começar com uma abordagem básica utilizando a biblioteca padrão do Java e, em seguida, vamos ver como usar a biblioteca OpenCSV, uma das mais populares para manipulação de CSV em Java.
Lendo um Arquivo CSV com a Biblioteca Padrão do Java
Usando classes do pacote java.nio.file
e java.util
, podemos criar uma função para ler um arquivo CSV linha por linha e armazenar os dados em uma estrutura de dados, como uma List
.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class ManipuladorCSV {
public static List<String[]> lerCSV(String caminhoDoArquivo) {
List<String[]> dados = new ArrayList<>();
try {
List<String> linhas = Files.readAllLines(Paths.get(caminhoDoArquivo));
for (String linha : linhas) {
String[] valores = linha.split(",");
dados.add(valores);
}
} catch (IOException e) {
System.out.println("Erro ao ler o arquivo" + e.getMessage());
}
return dados;
}
public static void main(String[] args) {
String caminho = "dados.csv";
List<String[]> dados = lerCSV(caminho);
for (String[] linha : dados) {
for (String valor : linha) {
System.out.print(valor + " ");
}
System.out.println( );
}
}
}
Explicação:
- Lemos todas as linhas do arquivo usando
Files.readAllLines
. - Para cada linha lida, usamos o método
split(",")
para dividir os valores e então armazená-los em uma lista.
Essa abordagem é eficiente para arquivos pequenos e é útil quando queremos uma solução leve e rápida.
Usando OpenCSV para Manipular arquivos CSV
A biblioteca OpenCSV oferece funcionalidades prontas para leitura e escrita de CSV, incluindo suporte para cabeçalhos, conversão de objetos e controle de delimitadores.
Para usar essa biblioteca, é necessário adicionar a dependência ao seu projeto. O código abaixo mostra essa adição com o Maven.
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.5.2</version>
</dependency>
Lendo um arquivo com OpenCSV
O processo de leitura de um arquivo usando a biblioteca é simples e pode ser consultado no código abaixo.
import com.opencsv.CSVReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
public class LeitorCSV {
public static void lerComOpenCSV(String caminhoDoArquivo) {
try (CSVReader reader = new CSVReader(new FileReader(caminhoDoArquivo))) {
List<String[]> linhas = reader.readAll();
for (String[] linha : linhas) {
for (String valor : linha) {
System.out.print(valor + " ");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String caminho = "dados.csv";
lerComOpenCSV(caminho);
}
}
A classe CSVReader
do OpenCSV simplifica a leitura linha por linha, e o método readAll()
nos dá uma lista com cada linha do arquivo já dividida em campos. Esse é o mesmo processo realizado no exemplo anterior, porém de uma forma mais simples.
Lendo de apenas uma coluna do arquivo com o OpenCSV
O OpenCSV não tem uma funcionalidade específica para ler dados de uma única coluna do arquivo, mas podemos fazer manualmente conforme mostrado no exemplo abaixo.
import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class LeitorCSV {
public static List<String> lerColunaPorNome(String caminhoDoArquivo, String nomeColuna) {
List<String> colunaDados = new ArrayList<>();
try (CSVReader reader = new CSVReader(new FileReader(caminhoDoArquivo))) {
System.out.println(reader);
String[] cabecalho = reader.readNext();
int indiceColuna = -1;
for (int i = 0; i < cabecalho.length; i++) {
if (cabecalho[i].equalsIgnoreCase(nomeColuna)) {
indiceColuna = i;
break;
}
}
String[] linha;
while ((linha = reader.readNext()) != null) {
if (indiceColuna < linha.length) {
colunaDados.add(linha[indiceColuna]);
}
}
} catch (IOException | CsvException e) {
System.out.println("Erro ao ler o arquivo: " + e.getMessage());
}
return colunaDados;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String caminho = "dados.csv";
System.out.println("Digite o nome da coluna que deseja ler:");
String nomeColuna = scanner.nextLine();
List<String> dadosColuna = lerColunaPorNome(caminho, nomeColuna);
System.out.println("Dados da coluna '" + nomeColuna + "':");
for (String valor : dadosColuna) {
System.out.println(valor);
}
}
}
Dessa forma, nós identificamos o índice da coluna desejada e pegamos apenas ela.
Escrevendo em um Arquivo CSV com OpenCSV
Vamos agora ver como escrever dados em um arquivo CSV com OpenCSV. Aqui é importante destacar que os dados a serem escritos no arquivo precisam ter o formato de array, sendo que cada array representa uma linha de dados do arquivo.
import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;
public class EscritorCSV {
public static void escreverComOpenCSV(String caminhoDoArquivo) {
String[] cabecalho = { "Nome", "Idade", "Cidade" };
String[] linha1 = { "Mateus", "25", "Pará" };
String[] linha2 = { "Lia", "30", "Paraná" };
try (CSVWriter writer = new CSVWriter(new FileWriter(caminhoDoArquivo))) {
writer.writeNext(cabecalho);
writer.writeNext(linha1);
writer.writeNext(linha2);
} catch (IOException e) {
System.out.println("Erro ao escrever o arquivo: " + e.getMessage());
}
}
public static void main(String[] args) {
String caminho = "dadosEscritos.csv";
escreverComOpenCSV(caminho);
}
}
Explicação:
- Utilizamos
CSVWriter
para escrever dados no arquivo. - Cada linha é um array de
String
, ewriteNext()
escreve essas linhas no arquivo.
Conclusão
Usar a biblioteca padrão do Java é uma opção viável para manipular arquivos CSV de forma simples e rápida, porém, para casos mais complexos (como CSVs com muitos campos, delimitações variáveis, etc.), o OpenCSV oferece mais flexibilidade e facilidade de uso.