SOLVED Ler arquivo CSV e retonar Array de String contendo os valores entre os ponto e virgulas

9 respostas
A

[RESOLVIDO]

Galera, minha dúvida acho que é mais relacionada a lógica.

Eu estou fazendo um teste pra uma empresa e o enunciado da ques tão é o seguinte:

Given a CSV (Comma-separated values) file passed as a java.io.BufferedReader, returns an array of String
corresponding to values of the fields.

Fazer a leitura do arquivo eu fiz numa boa, segue meu método:

public static String[] lerArquivo(BufferedReader br){ String resultado[] = null; try { String s = br.readLine(); while(s != null){ resultado = s.split(";"); s = br.readLine(); } } catch (Exception e) { // TODO: handle exception } return resultado; }

Só que com esse split percebi que ele substitui o que ja foi armazenado no array resultado.

Ou seja se eu tiver mais que uma linha no arquivo csv, meu retorno será sempre a última linha.

Gostaria de saber como poderia fazer pra retornar tudo?

Desde já agradeço imensamente a ajuda de vocês.

Abrs!

[RESOLVIDO]

9 Respostas

D

É que é exatamente esta a função do split. O que está ocorrendo é que você está tentando montar o array linha a linha e isso não é o mais adequado, justamente pela sobreposição que será obtida. Primeiramente, você deve ler todo o arquivo, para, então, criar o array.

A

Mas e depois que eu ler, como eu faço para o BufferedReader voltar para o começo do arquivo?

O método BufferedReader.reset() resolve?

Obrigado pela dica!

D

E precisa que o BufferedReader volte ao início por quê?
Se o problema é apenas seguir o enunciado, basta ler o BufferedReader

public static String[] lerArquivo(BufferedReader br){         
      String resultado[] = null;               
      StringBuffer linhas = new StringBuffer();
       try {                      
              String s = br.readLine(); 
                while(s != null){
                     linhas.append(s);
                }
             resultado = linhas.toString().split(";");
             } catch (Exception e) {   
            System.out.println("Erro> " + e.getMessage());
          } 
return resultado;
}

Após ler, basta invocar o split. Eu optei por um StringBuffer, você pode usar StringBuilder ou mesmo apenas String e ir concatenando com “+”.
Mas a idéia é primeiro ler, depois, proceder com a divisão.

R

Só faltou pegar a próxima linha dentro do while. Se s não for inicialmente nula, vai ficar dando append na mesma String :slight_smile:

Outra sugestão é fechar o Reader quando o processamento estiver finalizado, de preferência em um bloco finally

D

digaoneves:
Só faltou pegar a próxima linha dentro do while. Se s não for inicialmente nula, vai ficar dando append na mesma String :slight_smile:

Outra sugestão é fechar o Reader quando o processamento estiver finalizado, de preferência em um bloco finally


De fato, esqueci disto.

A

Nossa pessoa, muito obrigado!!!

Deu certo.

Só que com um porém… :smiley:

Tipo, quando eu chego na última coluna do meu csv acho que num tem a separação com ponto e virgula,
aí que que acontece ele tipo junta a ultima coluna com a linha debaixo.

Será que dá pra resolver isso?

Mas muito obrigado pela ajuda drsmachado!

D

Camarada, com certeza dá.
Talvez

linhas.append(s);
linhas.append(";");

resolva.

A

Nossa cara, vc é o mestre!!!

haha!!!

Resolvido!!!

Muitissimo obrigado! de verdade!!!

D

amaurinorato:
Nossa cara, vc é o mestre!!!

haha!!!

Resolvido!!!

Muitissimo obrigado! de verdade!!!


Que nada.
Méritos ao digaoneves, que me corrigiu. Eu havia ignorado por completo aquela possibilidade do loop infinito.
Aliás, aqui eu aprendo mais que compartilho.

Criado 19 de junho de 2012
Ultima resposta 19 de jun. de 2012
Respostas 9
Participantes 3