Ordenação de Campos TXT

8 respostas
B

Pessoal,

Eu tenho um programa que le 5 arquivos TXT e salva em outro arquivo TXT vazio as informações que preciso.

Para que seja salva a minha saida, utilizo o seguinte comando:

FileWriter bw = new FileWriter("C:/LOG/out.txt",true);

O parâmetro TRUE justamente serve para ele ir acumulando no TXT vazio as informações que preciso dos 5 arquivos TXT.

Porém, antes de gravar os dados no TXT vazio, eu salvo as informações em uma LIST e faço a ordenação por um campo específico que preciso, mas o que acontece e que o meu arquivo e ordenado pelo campo que preciso mas ele não ordena todas as informações de uma vez, ele ordena cada trecho que foi acumulando no TXT vazio.

Segue o meu código:

List<Arquivo> col = new ArrayList<Arquivo>();

while((linha = buff.readLine())!= null){   
	   		 
String [] dadosArq = linha.split(" ");    // SEPARA O ARQUIVO EM COLUNAS   
   	   
// CAPTURA APENAS AS INFORMACOES DOS ERROS
    if(linha.contains("ABENDED") || linha.contains("FAILED") ||  linha.contains("NOT CATLGD 2") || linha.contains("UNEXPLA")){   
// FILTRA APENAS ODATE ESPECIFICADO
    if(dadosArq[4].equals("221011")){   
 	
//INSTANCIA DA CLASSE ARQUIVO 
    Arquivo dados = new Arquivo();	 
 	    	
// SETANDO AS INFORMACOES NAS VARIAVEIS	
 	   
 	      dados.setSigla_Sistema(dadosArq[13].substring(0,2));                                        //SISTEMA
  	      dados.setData_Processamento(dadosArq[2]);                                                   //DATA DE PROCESSAMENTO 
  	      dados.setHr_Inicial(dadosArq[3]);                                                           //HORA
  	      dados.setOdate_Processamento(dadosArq[4]);                                                  //ODATE_PROCESSAMENTO
  	      dados.setNome_Job(dadosArq[13].substring(0,8));                                             //NOME_JOB
  	      dados.setNum_ID_Job(dadosArq[13].split("/")[1]);                                            //NUM_JOB_ID 
  	      dados.setUID(dadosArq[14].substring(4,9));                                                  //UID 
  	      
  	      
        // OCORRENCIAS
                    if (linha.contains("UNEXPLAINED")){    
 	           dados.setOcorrencias(dadosArq[16] + " " + dadosArq[18]);   
           } else if (linha.contains("NOT CATLGD 2")){   
        	   dados.setOcorrencias(dadosArq[15] + " " + dadosArq[16] + " " + dadosArq[17] + " " + dadosArq[18] + " " + dadosArq[19]);    
	   } else if (linha.contains("FAILED")){
	    	   dados.setOcorrencias(dadosArq[15] + " " + dadosArq[16] + " " + dadosArq[17]);
           } else if (linha.contains("ABENDED")){
        	   dados.setOcorrencias(dadosArq[15] + " " + dadosArq[17]);
   	   }
			     		 
	
	    //ADICIONA DADOS NA LIST	 
			   col.add(dados);
		 			       
 	               }     
	     	    }
	    	 }
	    
 	   fis.close();
      	   stream.close();
           buff.close();

           // METODO PARA ORDENAR.
	      OrdenaPorID or = new OrdenaPorID();
	      Collections.sort(col, or);

		      
	  // IMPRESSAO NO ARQUIVO
	      FileWriter bw = new FileWriter("C:/LOG/out.txt",true);     
	      PrintWriter bw1 = new PrintWriter(bw);    	  
	   
				
		for(Arquivo inf : col){
	       	     bw1.println(inf);
	   	}
	   		  	
		   		
		bw.close();
     	        bw1.close();

O que posso fazer para que seja ordenado o meu arquivo inteiro de uma vez e não apenas os trechos acumulados ?

Espero que tenha conseguido explicar a minha dúvida.

Obrigado.

8 Respostas

E

Todos os seus arquivos deveriam estar na mesma lista para serem ordenados corretamente.

Editado: Mesma lista.

R

Ou você poderia adicionar todos os 5 arquivos na sua list antes de ordená-los, e só depois printar, acho que resolve.

L

Ou você poderia adicionar todos os 5 arquivos na sua list antes de ordená-los, e só depois printar, acho que resolve.

haja memoria dependendo do tamanho dos arquivos…

R

Não sou nenhum especialista, mas como parece ser um daqueles relatórios exportados de mainframe acho que são uns bem parrudos hehehe

E

Eu recomendaria usar o comando do Unix (ou do Cygwin) chamado “sort” - ele permite ordenar arquivos maiores que a memória disponível.

B

Pessoal,

Obrigado pelo HELP, porém a situação é:

Realmente igual ao digaoneves disse, são logs do MAINFRAME que eu estou processando.

Os dados que preciso ele esta capturando normal e incluíndo antes da LIST. O problema esta depois, por que assim que termina a inclusão na LIST eu estou pedindo para ordenar. Mas o que ocorre é que como é feito a leitura de 5 arquivos ele não inclui tudo de uma vez na LIST, vai adicionando aos pedaços então quando peço para ordenar, ele ordena os pedaços que ele incluiu e não todas as informações.

como poderia fazer para ordenar o arquivo todo ?

D

Cara, eu imagino a memória necessária para processar isso tudo.
Já pensou em utilizar um banco de dados intermediário como meta-dados? O sqlite é uma boa pedida quando vc precisa gravar quantidades de dados a serem processados que excedem a memória disponível, além do que os dados virão da forma que você precisar.

E

vou dar 3 sugestões:

  1. Você pode usar o kettle para ler os arquivos e ordenar, no step sort dele vc pode passar um parâmetro “spool” com um diretório para ele usar para o ordenamento.
  2. Pode criar um código java (não sei se alguma classe implementa isso) que implemente o algoritmo balance line e vá criando spools para os arquivos.
  3. Usar uma base de dados para processar os arquivos como disse o doravan.
Criado 24 de outubro de 2011
Ultima resposta 25 de out. de 2011
Respostas 8
Participantes 7