Ordenação de Campos TXT

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.

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

Editado: Mesma lista.

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

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

haja memoria dependendo do tamanho dos arquivos…

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

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

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 ?

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.

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.