Problema com Split

5 respostas
H

Bom pessoal, eu estou tentando pegar os dados de um arquivo texto seguindo alguns padrões. Os dados são separados por ponto e vírgula (;), mas é possível que existam dados em branco, portanto, sequências de ponto e vírgula.

Com o StringTokenizer, fazendo um nextToken(";") ele não funcionou, pois, quando existe vários dados em branco(sequências de ponto e vírgula), o nextToken pula esses dados e isso não pode acontecer.

Procurei e descobri o Split() da classe String. Ele funcionou quase que perfeitamente se não fosse por um motivo. Segue exemplo de uma linha do meu arquivo

20/12/2008;23:40;;;;teste;

Nesse caso com o String Tokenizer ele só me retornava a data, hora e a palavra. Com o Split, ele retorna data, hora, 3 dados em branco e uma palavra.
Mas quando minha linha fica desse jeito:

20/12/2008;23:40;;;teste;;

Ele me retorna a data, hora, 2 dados em branco, a palavra e quando deveria me retornar mais um dado em branco, dá erro!
Alguém sabe como resolver esse problema?

Desde já obrigado!

5 Respostas

J

Posta o erro para vermos…

E

O método split(String) internamente chama split(String, 0)

Use:

split(";",-1);

H

Pessoal valeu pela ajuda, mas eu consegui resolver…
Vamos as explicações:

Meu arquivo segue um padrão, ou seja, cada linha possui 18 tokens, o problema é que nem sempre vão existir corretamente os 18 tokens, alguns lugares poderão estar vazios, mas ainda assim eu tenho que guardar esses valores nulos.

O Split, funcionou mas quando os últimos tokens do arquivos são os tokens vazios, ele não guarda no meu vetor de String os últimos dados.
Como no exemplo que eu dei acima, se eu fosse ler o último valor do meu vetor de String, sendo que esse último valor fosse vazio de acordo com o arquivo que estou lendo, ele dava o erro: ArrayIndexOutOfBounds.

A solução: Não sei se é a melhor técnica de se fazer isso, mas quando eu disparo essa exceção, dentro do catch eu faço o meu vetor receber um valor nulo na posição que até então não existia!

Espero que vcs tenham entendido direito o problema e valeu por tudo!!

E

Sim isso resolve, concatenar um espaço no final da String também e porque não [i]split(";",-1):

public static void main(String[] args) {
		String registro = "20/12/2008;23:40;;;teste;;;;;;;;;;;;;";
		
		String array[] = registro.split(";",-1);
		
		System.out.println("Quantidade de campos: " + array.length);
		for(String campo: array) {
			System.out.println("Campo: \"" + campo + "\"");
		}
	}
H

Legal, eu testei isso aqui tb.
Achei a sua solução muito melhor que a minha, até pq, usar uma exceção pra corrigir um erro não é uma coisa muito bonita de se fazer… :oops:
Valew pela ajuda!! :wink:

Criado 5 de março de 2008
Ultima resposta 6 de mar. de 2008
Respostas 5
Participantes 3