Manipulação de arquivos .txt [Resolvido]

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:

[code]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 ++;
        
        
        
        
    }
    
    
}[/code]

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

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.

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 ?

Isso mesmo, corretamente o que vc disse…

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:

[code] 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', ' '));

}[/code]

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

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.

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:

[code] 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);

}[/code]

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.

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