Arquivo TXT - AJUDA

17 respostas
brunosardao

Pessoal,

Eu estou fazendo a leitura de um arquivo TXT e preciso capturar informações de campos específicos. segue um exemplo da linha correta do meu arquivo:

[0 = , 1 = , 2 = 170611, 3 = 080319, 4 = 170611, 5 = CTMG, 6 = , 7 = , 8 = , 9 = , 10 = SEL208I, 11 = JOB, 12 = YLBJD605, 13 = YLBG6052/13695, 14 = OID=VEQHC, 15 = ENDED, 16 = "OK"]

Porém, neste arquivo existem linhas que não são iguais e não possuem as mesmas informações nos campos conforme a linha acima: exemplo:

[0 = , 1 = , 2 = 170611, 3 = 080319, 4 = 160611, 5 = CTMG, 6 = , 7 = , 8 = , 9 = , 10 = SEL219I, 11 = JOB, 12 = NQ1JD300, 13 = OID=VEFDM, 14 = ENDED, 15 = "NOT, 16 = OK"]

O meu código para captura destas informações, está desta forma:

if(leitor.contains("ENDED")){    // CAPTURA APENAS ENDOK    

   if(novoArq.length < 18){    //  FILTRA PARA PEGAR APENAS DADOS ANTES DA COLUNA 18

       if(novoArq[11].equals("JOB") || novoArq[11].equals("CYC")){       // FILTRO PARA COLETAR APENAS JOBS  OU JOBS CYCLICOS
      
            if(novoArq[13].length() > 8 && novoArq[4].equals(odate)){     // FILTRA PARA CAPTURA DE JOBS APENAS COM 8 POSIÇÕES						
                          
                           StringBuilder linhaSaida1  = new StringBuilder(); 
		   		 
                           linhaSaida1.append(novoArq[13].substring(0,2)).append("  ");         // SISTEMA	

                           linhaSaida1.append(novoArq[2]).append("  ");                         // DATA_PROCESSAMENTO         

                           linhaSaida1.append(novoArq[3]).append("  ");                         // HORA     

                           linhaSaida1.append(novoArq[4]).append("  ");                                 // ODATE                       

                           linhaSaida1.append(novoArq[13].substring(0,8)).append("  ");         // JOB         

                           linhaSaida1.append(novoArq[13].split("/")[1]).append("  ");          // JOB_ID                  

                           linhaSaida1.append(novoArq[14].substring(4,9)).append(" ");          // UID

            	           linhaSaida1.append(novoArq[15] + " " + novoArq[16]);                 // OCORRENCIAS   
	    		   				             
           
             endokArquivo.add(linhaSaida1.toString()); // ADICIONA AS LINHAS NO ARRAYLIST DOS ENDOKs

Com este código está ocorrendo ArrayIndexOutOfBoundsException: 1, justamente por que na coluna 13 não tem a informação correta.

o que posso fazer para corrigir o meu código a fim de capturar apenas informações que estejam nas posições exatas conforme a linha abaixo:

[0 = , 1 = , 2 = 170611, 3 = 080319, 4 = 170611, 5 = CTMG, 6 = , 7 = , 8 = , 9 = , 10 = SEL208I, 11 = JOB, 12 = YLBJD605, 13 = YLBG6052/13695, 14 = OID=VEQHC, 15 = ENDED, 16 = "OK"]

Obrigado a todos

17 Respostas

rogelgarcia

Acho que seria mais interessante que você criasse uma classe para representar uma linha do arquivo… seria como um map.

Você lê uma linha, separa as virgulas e as propriedades, e preenche o mapa.

Depois você terá uma lista de mapas, cada mapa será uma linha.

Com essa lista você faz o seu processamento.

brunosardao

rogelgarcia

Como poderia fazer isso? pois para te falar a verdade não tenho ideia de como começar…:frowning:

Será que você poderia dar o pontapé inicial ?

Obrigado,

rogelgarcia

Vou colocar mais ou menos um pseudocódigo aqui… pra vc ter uma noção…

Seu programa terá 2 partes… uma é apenas ler o arquivo… e a outra é efetuar o processamento (ao invés de fazer tudo misturado

Para cada linha faça

Map<String, String> map = new HashMap();

String linha = readLine();

linha = linha.substring(1, linha.length()-1); //isso irá tirar os colchetes
String[] props = linha.split(","); //isso irá separar as propriedades

for(String prop: props){
    String[] keyValue = prop.split("="); //separa a chave do valor da propriedade
    map.put(keyValue[0], keyValue[1]);
}

lista.add(map);

Depois vc pega a lista com os mapas… e efetuar a operação que desejar…

O negócio é separar as tarefas… uma coisa de cada vez.

(será necessário um tratamento melhor no código porque tem alguns poréns… mas isso aí já é com vc :wink: )

brunosardao

rogelgarcia

muito obrigado pela ajuda, só uma coisa…

na realidade o meu arquivo esta desta forma:

250511 043623 240511 CTMK     SEL208I JOB JBBJD715 JBBKD715/44870 OID=54DKI ENDED "OK"
  250511 043628 240511 CTMK     SEL208I JOB BGBJ7B45 BGBK7B45/44746 OID=546WR ENDED "OK"
  250511 043628 240511 CTMK     SEL208I JOB BGBJ7E59 BGBK7E59/44684 OID=5470X ENDED "OK"

Daquela forma que eu havia lhe mostrado, é que tenho um método que faz a leitura do arquivo e divide ele para que eu consiga enchergar em qual posição esta determinada informação.

na sua explicação, cada item que eu incluir com o map.put será uma coluna do meu arquivo conforme acima ?

valeu.

rogelgarcia

Isso mesmo… cada coluna um map.put()

brunosardao

rogelgarcia,

valeu cara, obrigado, porém ainda assim ficou um pouco confuso para mim, preciso dar mais uma estudada nesta estrutura MAP que ainda tenho um pouco de dificuldade. :slight_smile:

Porém, achei uma solução, fiz um IF apenas para obter dados de uma determinada posição e assim deu certo.

Mas agora tenho uma dúvida até meio idiota, mas não custa perguntar.

no meu arquivo TXT eu tenho uma coluna que são os ID´s e neles estão ocorrendo duplicidades. exemplo:

12345 - CORRETO
12345 - DUPLICADO
52352 - CORRETO
52352 - DUPLICADO

o segundo registro é sempre o duplicado e o primeiro é o correto. como posso fazer uma comparação entre o valor de baixo com o de cima e se duplicado removê-lo ?

valew…

brunosardao

Alguém poderia me dar uma força referente a esta minha duvida sobre como remover informações duplicadas do meu arquivo.?

obrigado a todos.

rogelgarcia

Cara … mas que preguiça de pensar é essa?

Salve em uma variavel a linha que acabou de ler… quando for ler a proxima… veja se sao iguais… se forem nao faça nada, continue o loop.

brunosardao

Cara, na boa, não é preguiça de pensar não, e sim dificuldade em criar esta lógica, pois para mim é um pouco complicado.

Acredito que para você que trabalha possivelmente com programação é muito mais fácil, porém eu não trabalho com programação e não tenho hábito se sempre programar, por isso que perguntei como fazer. pois se tivesse um conhecimento mais abrangente de lógica, com certeza não tinha feito esta pergunta que para você e para os outros é simples e chega até ser idiota, mas para mim é uma dificuldade. mas sem crise, vou tentar dar os meus pulos.

fora isso, obrigado pela força dada a mim anteriormente!

[]´s

rogelgarcia

Faz o que eu sugeri… salva em uma variável… e compara…

Vc terá duas variaveis uma com a linha atual e outra com a linha anterior…

brunosardao

beleza rogelgarcia , vou tentar fazer o que você me falou, caso não consiga exito, posto aqui novamente.

mais uma vez muito obrigado,

[]´s

rogelgarcia

Você terá algo assim

String linha;
while((linha = readLine()) != null){
    ....
}

O primeiro passo é:

String linha;
String ultimaLinha = null;
while((linha = readLine()) != null){
    ....
}

Veja se consegue prosseguir

brunosardao

Pessoal,

Estou tendo uma pequena dificuldade, fiz o processo abaixo para remover registros duplicados do meu arquivo TXT, porém, ainda estão sobrando algumas linhas duplicadas.

como posso fazer para remover todas as duplicadas sem ficar nenhuma mesmo ?

Segue o meu código:

public void removerDuplicado() throws IOException{	

	try{
		
// Leitura do arquivo
		
	Set&lt;String&gt; lines = new HashSet&lt;String&gt;();
	BufferedReader reader = new BufferedReader(new FileReader("C:/LOG/Arquivos/ResumoHG/RESUMO_HG_110711.txt")); 
	
	
	String line;
	
	    while((line = reader.readLine()) != null) { 
	    	
	           if(!line.equals(lines)){
	        	   
	        	   lines.add(line);
               }
         }
	    	
	   reader.close();
	   
// gravação do arquivo	   
	   
	   BufferedWriter arqSaida = new BufferedWriter(new FileWriter("C:/LOG/novoArquivo.txt")); 
	   
	   
	      for(String arquivo: lines){
	    	  
	    	  arqSaida.write(arquivo);
	    	  arqSaida.newLine();
	    	  
	      }
	   
	   
	     arqSaida.close(); 

	     System.out.println("Processo Concluído");
	     
	     
	}catch(FileNotFoundException x){
		
		x.printStackTrace();
          }
   }

Obrigado,

brunosardao

Bom, aproveitando, se alguem puder ajudar…

Eu tenho uma lista com informações de um arquivo TXT.

Eu preciso ordenar esta lista pelo coluna ID. que é a terceira coluna do arquivo TXT.

como eu poderia fazer isso ?

Alguém poderia me ajudar ?

Obrigado,

brunosardao

alguem poderia dar uma força…

ViniGodoy
  1. Crie uma classe que representa a linha do arquivo;
  2. Leia o arquivo, criando uma lista de objetos dessa classe;
  3. Crie um comparator para ordenar pela coluna que você quer;
  4. Use o Collections.sort na lista;
  5. Grave seu arquivo ordenado.

Se não sabe o que é um Comparator, leia:

brunosardao

Obrigado Vini.

Tentarei fazer o que você passou.

Obrigado,

Criado 25 de junho de 2011
Ultima resposta 17 de jul. de 2011
Respostas 17
Participantes 3