Blog Formação DEV

Manipulação de Arquivos CSV em Java: Leitura e Escrita

Descubra como trabalhar com arquivos CSV de forma simples na linguagem Java.
Manipulação de Arquivos CSV em Java: Leitura e Escrita
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, e writeNext() 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.

Sobre o autor
Cod3r

Cod3r

Com mais de 400 mil alunos, a Cod3r é uma das principais escolas de tecnologia do País. Um de seus produtos mais importantes é a Formação DEV, com objetivo de preparar os profissionais para o mercado.

Ótimo! Inscreveu-se com sucesso.

Bem-vindo de volta! Registou-se com sucesso.

Assinou com sucesso o Blog Formação DEV .

Sucesso! Verifique o seu e-mail para obter o link mágico para se inscrever.

As suas informações de pagamento foram atualizadas.

Seu pagamento não foi atualizado.