Ir ao conteúdo

Posts recomendados

Postado

Eu preciso ler um arquivo no formato CSV com o seguinte formato:

agencia;conta;saldo;status
0101;12225-6;100,00;A
0101;12226-8;50,00;A

Após ler o arquivo, eu tenho um serviço que valida se foi feita uma atualização (colocando true ou false) e, necessariamente preciso gerar uma nova coluna, gerando um novo CSV. Eu consegui ler o arquivo, mas quando vou gerar o novo CSV, só consigo gravar o primeiro registro.

 

public void exportarParaCSV(Writer writer){
        try {
            Files.lines(Paths.get("arquivo.csv"))
                    .skip(1)
                    .map(linha -> linha.split(";"))
                    .map(coluna -> {
                        try {
                            if (!Files.readAllLines(Paths.get("arquivo.csv")).isEmpty()) {
                                try (CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT)) {
                                    AssociadoResponse associadoResponse = new AssociadoResponse(coluna[0], coluna[1], coluna[2], coluna[3], receitaService.atualizarConta(coluna[0], coluna[1], coluna[2], coluna[3]));
                                    csvPrinter.printRecord(associadoResponse.getNroCoop(), associadoResponse.getNroConta(), associadoResponse.getSaldo(), associadoResponse.getStatus(), associadoResponse.isResposta());
                                    return associadoResponse;
                                } catch (InterruptedException | IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        return null;
                    })
                    .forEach(System.out::println);

        } catch (IOException e){
            System.out.println("erro");
        }
    }

 

Como eu posso fazer para que eu percorra todo arquivo?
Segue exemplo gerado com o serviço acima:
0101,12225-6,"100,00",A,true

 

  • Curtir 1
Postado

Veja se isso te ajuda:

package teste.leitorcsv;

import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Scanner;
import java.util.StringJoiner;
import java.util.random.RandomGenerator;
import java.util.stream.Stream;

public class LeitorCSVApp implements Runnable {

    private String converterObjetosParaString(List<ObjetoModelagem> objetos) {
        NumberFormat  formatadorDecimal = NumberFormat.getInstance();
        StringBuilder conteudo          = new StringBuilder();


        /*
         * Cria a linha de cabecalho automaticamente usando reflection para
         * obter o nome dos atributos declarados na classe ObjetoModelagem.
         */
        StringJoiner cabecalho = new StringJoiner(";", "", "");

        Stream.of(ObjetoModelagem.class.getDeclaredFields())
              .map(Field::getName)
              .forEach(cabecalho::add);

        conteudo.append(cabecalho)
                .append(System.lineSeparator());


        objetos.forEach(objeto -> conteudo.append(objeto.agencia)
                                          .append(";")
                                          .append(objeto.conta)
                                          .append(";")
                                          .append(formatadorDecimal.format(objeto.saldo))
                                          .append(";")
                                          .append(objeto.status)
                                          .append(";")
                                          .append(objeto.algumaCoisa)
                                          .append(System.lineSeparator()));

        return conteudo.toString();
    }

    private ObjetoModelagem criarObjetoAPartirDaLinhaCSV(String linha) {
        String[] valores = linha.split(";");

        // Esta faltando informacao na linha, entao pulamos ela.
        if (valores.length != 4) return null;

        ObjetoModelagem objeto = new ObjetoModelagem();
        objeto.agencia = valores[0];
        objeto.conta = valores[1];
        objeto.status = valores[3].charAt(0);

        /*
         * O scanner considera o locale na hora de converter string
         * para double. Ele automaticamente reconhecera se o valor
         * e separado por ponto ou por virgula.
         */
        Scanner scanner = new Scanner(valores[2]);
        objeto.saldo = scanner.nextDouble();

        return objeto;
    }

    private void escreverCSV(String conteudo, Path arquivo) {
        try {
            // Apaga os dados antigos
            Files.deleteIfExists(arquivo);

            // Escreve os novos dados criando o arquivo se necessario
            Files.writeString(arquivo, conteudo, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private List<ObjetoModelagem> lerCSV(Path arquivo) {
        List<ObjetoModelagem> objetos = new ArrayList<>();

        try {
            Files.readAllLines(arquivo)
                 .stream()
                 .skip(1)
                 .map(this::criarObjetoAPartirDaLinhaCSV)
                 .filter(Objects::nonNull)
                 .forEach(objetos::add);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return objetos;
    }

    private void simularProcessamento(ObjetoModelagem objeto) {
        int valor = RandomGenerator.getDefault().nextInt(0, 100);
        objeto.algumaCoisa = valor % 2 == 0;
    }

    @Override
    public void run() {
        String caminho = "src/teste/leitorcsv/";

        Path arquivoOrigem  = Path.of(caminho + "origem.csv");
        Path arquivoDestino = Path.of(caminho + "destino.csv");

        List<ObjetoModelagem> objetos = lerCSV(arquivoOrigem);
        objetos.forEach(this::simularProcessamento);

        String conteudo = converterObjetosParaString(objetos);
        escreverCSV(conteudo, arquivoDestino);
    }

    private static class ObjetoModelagem {

        public String  agencia;
        public String  conta;
        public double  saldo;
        public char    status;
        public boolean algumaCoisa;

        public ObjetoModelagem() {
        }

        public ObjetoModelagem(String agencia, String conta, double saldo, char status) {
            this.agencia = agencia;
            this.conta = conta;
            this.saldo = saldo;
            this.status = status;
        }
    }
}

 

Está simplificado para facilitar o entendimento.

  • Obrigado 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!