Manipulação de arquivos .txt [Resolvido]

8 respostas
K

Pessoal estou com um problema em relação a manipulação de arquivos do tipo txt. Estou com um problema no meu código de leitura, que consegui resolver parcialmente o problema. Abaixo segue os caracteres que irão conter no meu arquivo .txt

T0129301;3 EMME S.R.L -VIA BROSETA 64/B
T0132601;A. J. LIMA AGROINDUSTRIAL LTD -FAZENDA BOA VISTA L
C0025601;A.C. AGROMERCANTIL LTDA -FAZ SANTA ROSALIA S
C0025602;A.C. AGROMERCANTIL LTDA -FAZ SANTA LUCIA S/N
T0188601;A.G. DO BRASIL LTDA -AV. JANDIRA, 295 -
T0119201;ABADIA PERES DE ARAUJO SILVA -FAZENDA DOS BARROS
T0099801;ABDIAS CARLOS DE ARAUJO -FAZENDA PEROBAS
C0018101;ABEL NUNES DA CUNHA -FAZENDA JUNKA - MAC
T0184801;ABEL REBOLO GARCIA -FAZENDA OSVALDO CRU
T0131701;ABNER GOMES ROMAO FILHO -FAZENDA PONTE VELHA

No meu código eu consegui separar os tokens pelos delimitadores ";" e "-", só que em alguns casos o endereço que seria o ultimo elemento da minha linha
esta sendo separado tbm. Pensei em talvez separar da forma que eu pegasse ate tal numero da coluna o primeiro elemento, depois do elemento seguinte da coluna ate o final do outro elemento, e depois o ultimo elemento da minha linha. Esta captura estaria sendo feita pela numeração da coluna, só que não sei como fazer pra conseguir isso.
O meu código que eu implementei com a sepação dos tokens segue abaixo:

public void actionPerformed(ActionEvent e) {
        String caminho;
        
        fc = new JFileChooser();
        defineFiltro();
        if (e.getSource() == importarBotao) {
            int returnVal = fc.showOpenDialog(Miscelania.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                log.append("Importando arquivo: " + file.getName() + "." + newline);
                
                if(!file.exists())   
                {   
                    System.out.println("arquivo existe");   
                } 
                try
                {
                    BufferedReader in = new BufferedReader( new FileReader(file),1*10*10);
                    String linha;
                    int linecount = 0;
                    while((linha = in.readLine())!= null)
                    {
                        System.out.println("Linha do arquivo nr: "+ ++linecount);
                        StringTokenizer tokencodigo = new StringTokenizer(linha, ";");
                        int contToken = 1;
                        String primeiroElemento;
                        String segundoElemento;
                        while(tokencodigo.hasMoreTokens())
                        {   
                            
                            String palavra;
                            palavra = tokencodigo.nextToken();
                            
                            
                            if(contToken == 1 )
                            {
                                primeiroElemento = palavra;
                                System.out.println("Codigo Produtor: "+primeiroElemento);
                            }
                            else
                            {
                                segundoElemento = palavra;
                                separaToken(segundoElemento);
                            }
                            contToken ++;
                            
                        }
                
                    }           
                     
                }
                catch(Exception erro)
                {
                    JOptionPane.showMessageDialog(null,"erro: "+erro);
                }
                       
            } else {
                log.append("Processo cancelado pelo usuário:" + newline);
            }
            log.setCaretPosition(log.getDocument().getLength());

        
        } else if (e.getSource() == exportarBotao) {
            int returnVal = fc.showSaveDialog(Miscelania.this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                log.append("Exportando arquivo: " + file.getName() + "." + newline);
            } else {
                log.append("Processo cancelado pelo usuário:" + newline);
            }
            log.setCaretPosition(log.getDocument().getLength());
        }
    }

public void separaToken(String segundoElemento){
        String linha = segundoElemento;
        StringTokenizer tokenNomeProdutor = new StringTokenizer(linha, "-");
        int contToken = 1;
        String primeiroElemento;
        
        while(tokenNomeProdutor.hasMoreTokens())
        {
            String palavra;
            palavra = tokenNomeProdutor.nextToken();
                       
            if(contToken == 1 )
            {
                 primeiroElemento = palavra;
                 System.out.println("Nome Produtor: "+primeiroElemento);
            }
            else
            {
                 if(contToken == 2)
                 {
                 segundoElemento = palavra;
                 System.out.println("Nome Fazenda: "+segundoElemento);
                 }
            }
            contToken ++;
            
            
            
            
        }
        
        
    }

8 Respostas

C

O problema não está bem na manipulação de arquivo então né.
Para alterar quase nada, porque você simplismente não altera o caractere de separação para um que não apareça em endereços ou uma sequência de caracteres ? como “/-/” por exemplo

K

Meu sistema basicamente deveria dividir cada linha em tres partes, uma para o codigo do cliente, outra para o nome do cliente e o endereço ou fazenda do cliente.
Quando utilizei a classe tokenizer eu visualizei uma possível solução que seria delimitar essa divisão através dos delimitadores “;” e “-”, porém no endereço ou fazenda aparecem esse tipo de caracter no meio da string, impossíbilitando que eu a pegue por inteiro.
Seria este o meu problema, porém ouvi falar da solução que seria a captura através do numero da coluna e acho que esta seria uma solução que caíria bem.

C

Você desconsiderou completamente o que falei anteriormente ? hehe
Bem, não estou entendendo bem o que você quer dizer por “valor da coluna”. Você quer ler toda uma linha e ter de ante-mão que a partir da posição 0 até uma posição X, você tenha o primeiro campo, da posição X até na posição Y seria o segundo campo, e de Y + 1 até o fim seria o terceiro ?

K

Isso mesmo, corretamente o que vc disse…

C
Isso vai exigir mais modificações no código, mas vou propor uma forma: use StringBuilder para formatar suas Strings antes de escreve-las no arquivo. Vou colocar um código exemplo simples de como você poderia usar a classe:
public static void main(String args[]) {

		StringBuilder buffer = null;

		buffer = new StringBuilder("name");

		buffer.setLength(15);
		System.out.println(buffer.toString());
		System.out.println(buffer.toString().replace('\0', ' '));

	}

Primeiro foi criado um objeto StringBuilder com a String "name". Depois usei o método .setLength do objeto, para definir que aquele objeto vai ter aquele número de caracteres (que seria o valor de caracteres de um campo no seu caso)(repare que a classe coloca caracteres '\0' para preencher o espaço necessário, ou descarta caracteres além do limite). Depois mandei imprimir o valor salvo 2x, primeiro do jeito que tá salvo no StringBuilder e como você salvaria no arquivo, e outra, é uma forma de pegar todos aqueles caracteres e sumir com os caracteres '\0'.

É isso mesmo ? No caso cada campo teria que ter um tamanho limitado, mas seria assegurado que sempre ocupariam o mesmo espaço

K

Entaum isso daí seria para a escrita. A escrita deste arquivo eu não consigo modificar pois este arquivo é derivado de outro sistema, microsiga no caso. Este arquivo é me passado pelo meu chefe.
sua lógica tah correta, e se eu aplicar um algoritimo pra leitura deste arquivo seguindo esta logica vai dar certo. Para vc dar uma analisada:
o primeiro elemento contem 8 caracteres, ou seja vai da coluna 1 até a coluna 8, o segundo elemento contem 29 caracteres, indo da coluna 10 até a 38 e o terceiro elemento contem o restante dos caracteres da linha.

C
ah ... achei que você tava escrevendo o arquivo também. Então, você poderia separar a string em dois tokens como você está fazendo, sendo o primeiro o "primeiro campo" e o segundo "segundo + terceiro campo" E então pegar a string resultante do segundo token e ter o segundo campo como a substring de 0 até indexOf('-') e o terceiro campo como o resto. Exemplo:
public static void main(String args[]) {
		String stringQualquer = "Ola; Como vai - Você - Heim ?";

		StringTokenizer tokens = new StringTokenizer(stringQualquer, ";");
		String campo1 = tokens.nextToken();

		System.out.println(campo1);

		String outrosCampos = tokens.nextToken();

		System.out.println(outrosCampos);

		String campo2 = outrosCampos.substring(0, outrosCampos.indexOf('-'));

		System.out.println(campo2);

		String campo3 = outrosCampos.substring(outrosCampos.indexOf('-'),
				outrosCampos.length() - 1);

		System.out.println(campo3);

	}

EDIT: Endereço pode ter ; também ? se puder talvez seja melhor fazer o mesmo tratamento do segundo e terceiro campo no primeiro ao invés de usar o tokenizer.

K

Cara caiu como uma luva, tava precisando descobrir era esse metodo substring mesmo…
Vlw, muito obrigado pela mão.

Criado 19 de setembro de 2009
Ultima resposta 19 de set. de 2009
Respostas 8
Participantes 2