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

[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]

É 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.

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!

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.

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

[quote=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[/quote]
De fato, esqueci disto.

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!

Camarada, com certeza dá.
Talvez

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

resolva.

Nossa cara, vc é o mestre!!!

haha!!!

Resolvido!!!

Muitissimo obrigado! de verdade!!!

[quote=amaurinorato]Nossa cara, vc é o mestre!!!

haha!!!

Resolvido!!!

Muitissimo obrigado! de verdade!!![/quote]
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.