Problema de logica

Bom, estou com o seguinte problema…
Estou lendo um arquivo texto que tem 20 linhas…cada cada linha deste arquivo existem dados pessoais tipo: nome, endereco, fone, etc… separados por “,” (virgula).

Fiz uma função que lê linha a linha…

		try{
		FileReader reader = new FileReader("C:/teste.csv"); 
		BufferedReader leitor = new BufferedReader(reader);
		
		String linha = null;
		
		while((linha=leitor.readLine())!=null) {
		     System.out.println("Linha: " + linha);
			
		     for(int i = 0; i<Ferramentas.pegaDelimitador(linha, ",").length;i++){

		     }


		 }
		 leitor.close();
		 reader.close(); 
		 
		}catch (Exception e) {
			System.out.println("ERRO DE ARQUIVO: " + e);
		}

Esta função “pegaDelimitador” captura todos os valores entre as virgulas e armazena em um array

pegaDelimitador:


public static String [] trataDelimitador(String frase, String delimitador)
  {
    StringTokenizer st = new StringTokenizer(frase,delimitador.trim());
    String [] aux = new String[st.countTokens()];
    int cont = 0;

    while (st.hasMoreTokens())
    {
      aux[cont] = st.nextToken();
      cont++;
    }
    return aux;
  }

Não estou conseguindo montar uma logica para armazenar os valores de cada linha em objetos…Dentro do for eu gostaria de colocar:


setNome(Ferramentas.pegaDelimitador(linha, ",")[0]);
setEndereco(Ferramentas.pegaDelimitador(linha, ",")[1]);
setFone(Ferramentas.pegaDelimitador(linha, ",")[2]);

grato>

Concorda comigo que o conteúdo da linha não irá mudar?
Então não precisa chamar tantas vezes esse seu método pegaDelimitador(). Cada vez que você chama esse método ele repete todo o trabalho de separar as palavras da sua linha…

E outra, se vc tem tudo separadinho por virgulas, basta usar o método split(), da classe String. Ele já devolve um array de Strings com as palavras que estavam separadas por virgula. Dá uma olhadinha na API de String sobre esse método. Fica algo assim:

String[ ] palavras = linha.split(",");

Uma vez tendo o array palavras, basta acessar cada indice dele e ir setando os atributos da sua classe :wink:

ah…Entendi cassio e realmente tem sentido…mas me diz uma coisa…como faço para quando eu iniciar a leitura, dizer a partir de qual linha ele deve começar a leitura…

Falo isso porque o arquivo tem u cabeçalho e nao irei precisar dele…

grato

Nao tem como dar esse “pulo” em um arquivo texto, o mesmo tem que ser lido linha por linha. O que vc pode fazer é ver se o cabeçalho tem o número de linhas fixo. Vc abre o BufferedReader, faz um loop com esse numero de linhas que quer ignorar e faz getLine() tantas vezes. Assim, vc vai posicionar o BufferedReader na primeira linha válida.
Caso o tamanho do cabeçalho varie, voce pode verificar se neste arquivo existe algum caracter que indique o fim do cabecalho ou o inicio de cada linha. Assim, vc pode ir lendo as linhas (e ignorando as mesmas) até alcançar a primeira linha válida.

Eu nao entendi este getLine(), voce pode me dar um exemplo bem tosco para que eu possa me localizar??

grato

Acho que ele quis dizer pra vc fazer o mesmo leitor.readLine() que vc fez antes, porem não utilizar as linhas enquanto não acabar o cabecalho.

ex.: se seu cabecalho tivesse n linhas, vc faria:

for(int = 0; i < n; i++){
   leitor.readLine(); // Mas não usa a linha pra nada.
}

Depois disso, vc faz:

while((linha=leitor.readLine())!=null) {
//Agora você já está nas linhas que lhe interessam, então faça o que quiser com ela.
}

Escuta, você está usando que versão de java?

Se for o java 5 ou superior, sua função pegaDelimitador não precisaria existir. Você poderia fazer simplesmente:

String[] partes = frase.split(delimitador);

E com a vantagem nesse caso que o delimitador poderia ser definido por uma expressão regular.

[EDIT] Foi mal, mas só agora vi que o Cassio já tinha postado essa dica! :oops: :lol: