Problemas com StringTokenizer() (RESOLVIDO)

4 respostas
rafaelvannucci

Pessoal, tenho um problema que é o seguinte,

tenho um arquivo TXT que tem varios campos separados por “|”.
suponhamos o seguinte arquivo:

|I200|0120081201000001001|01122008|63310,34|N|
|I250|49102||61710,34|C|0120081201000001001000002001001C0110101||TRANSF. DE VALOR||
|I250|1322002||61710,34|D|0120081201000001001000002001001D0110101||BAIXA PATR.||
|I250|39602||1600,00|C|0120081201000001001000004001001C0110101||TRANSF. DE VALOR||
|I250|1310104||1600,00|D|0120081201000001001000004001001D0110101||TRANSF. DE VALOR||
|I200|0120081201008810001|01122008|56058,54|N|
|I250|38302||169,60|D|0120081201008810001000001001001D0110101||PARIZZI-REP.||

note que existem campos nao preenchidos… aparecem como ||
quando este campo entra no token, ele nao reconhece os espaços “null” e portanto gera um erro no meu codigo, pois em cada campo eu dou um next.token.

Alguem sabe como posso resolver este problema??

abaixo meu método que trata o arquivo:

public void montaDiario(String impTabela, String supTabela) throws FileNotFoundException, IOException {

        //TABELAS I200 inicializa as variáveis
        String NUM_LCTO=null;
        String DT_LCTO=null;
        String VL_LCTO=null;
        String IND_LCTO=null;

        //TABELAS I250 inicializa as variáveis
        String COD_CTA=null;
        String COD_CCUS=null;
        String VL_DC=null;
        String IND_DC=null;
        String NUM_ARQ=null;
        String COD_HIST_PAD=null;
        String HIST=null;
        String COD_PART=null;

        vetLinha = new ArrayList();//cria um vetor para armazenar a linha
        StringTokenizer token; //inicializa o token
        String TABELA=null;//inicia a string q armazena o tipo de tabela
        String linha;//instancia a string da linha


        if (resp != JFileChooser.CANCEL_OPTION) {//se a resposta do dialog of ok, entra

            BufferedReader arq = new BufferedReader(new FileReader(this.arquivoEnd));//abre o arquivo especificado
            linha = arq.readLine(); //inicializa a variavel linha            
            while ((linha=arq.readLine()) != null){//enquanto existir linha
            token = new StringTokenizer(linha, "|"); //inicializa o token
            TABELA = token.nextToken();//pega o nome da tabela na linha
            
                if (TABELA.equals(supTabela)){//se a tabela é a superior
                    while(token.hasMoreTokens()){//e enquento tiver tokens
                        NUM_LCTO = token.nextToken();
                        DT_LCTO = token.nextToken();
                        VL_LCTO = token.nextToken();
                        IND_LCTO = token.nextToken();
                    }//fim do while tokens
                }//fim do if supTabela
                else if (TABELA.equals(impTabela)){//se não se a tabela for a que quero importar
                    while(token.hasMoreTokens()){//e enquanto existir um token
                        COD_CTA = token.nextToken();
                        COD_CCUS = token.nextToken();
                        VL_DC = token.nextToken();
                        IND_DC = token.nextToken();
                        NUM_ARQ = token.nextToken();
                        COD_HIST_PAD = token.nextToken();
                        HIST = token.nextToken();
                        COD_PART = token.nextToken();
                    }//fim do while token

                //adiciona as variaveis no array
                vetLinha.add(NUM_LCTO);
                vetLinha.add(DT_LCTO);
                vetLinha.add(COD_CTA);
                vetLinha.add(COD_CCUS);
                vetLinha.add(VL_DC);
                vetLinha.add(IND_DC);
                vetLinha.add(NUM_ARQ);
                vetLinha.add(COD_HIST_PAD);
                vetLinha.add(HIST);
                vetLinha.add(COD_PART);
                
                }//fim do if else
            
            if (!vetLinha.isEmpty())//se o vetor nao é vazio,
                pilha.add(vetLinha);//adiciona o array a pilha
            }//fim while linha    

            arq.close();//fecha conexao do arquivo
        }//fim if


    }//fim do método

4 Respostas

S

já tentou tratar este erro verifica se token.nextToken() não é null

ViniGodoy

Por que você está usando StringTokenizer? Seu Java é anterior ao 1.4?

E

Não use StringTokenizer se você tiver campos vazios (que é exatamente o seu caso). No seu caso em particular, você pode usar String.split (mais simples) ou então usar String.indexOf (mais chatinho, mas funciona com versões antigas do Java).

Só tomar o cuidado com String.split, porque ele usa expressões regulares. Como “|” é uma expressão regular, você tem de usar “\|” em seu lugar.

rafaelvannucci

pessoal muito obrigado pelas dicas!
Eu estou iniciando em java e por falta de conhecimento nao sabia que o Tokenizer havia ficado obsoleto…
vou refazer meu codigo usando o String.Split()

Valeu pessoal! Grande abraço!

Criado 8 de março de 2010
Ultima resposta 8 de mar. de 2010
Respostas 4
Participantes 4