Leitura de vários arquivos e gravação

9 respostas
B

Pessoal, bom dia!

Eu tenho o seguinte código:

public void processamento() {   

        FileInputStream stream = new FileInputStream("Abend.txt");   
        InputStreamReader streamReader = new InputStreamReader(stream);   
        BufferedReader reader = new BufferedReader(streamReader);   
	    	  
	    	    
        FileWriter fileWriter = new FileWriter("HGAbend.txt");
        PrintWriter writer = new PrintWriter(fileWriter);   
	    	  
	
        FileWriter filewriter1 = new FileWriter("HGErro.txt");
        PrintWriter writer1 = new PrintWriter(filewriter1);
    	    
                String line = null;   
                      while( (line=reader.readLine() ) != null ) {   
	    	        	  
                            if (line.contains("ABENDED")){
	    	        		  
                                       writer.println(line); 
                               }    
                            else {
                                       writer1.println(line);  
                                   }
                            }

	       writer.close();  
	  fileWriter.close();   
                      reader.close();    
            streamReader.close();   
	      stream.close();   
	    	      
	     } catch (IOException e) {   
	          e.printStackTrace(); 
	     }   
	}
           }

Neste código ele lê apenas um arquivo e extrai as informações em dois arquivos diferentes: um com o nome de HGABEND.txt e outro com o nome de HGERRO.txt.

Minha dúvida é:

  • Eu preciso ler vários arquivos que tem a mesma informação e estrutura, e após a leitura de todos eles , tudo que tiver o nome ABEND será acumulado no arquivo HGABEND.TXT e tudo que não tiver esta informação será salvo no arquivo HGERRO.TXT.

Vocês poderiam me ajudar por favor ?

Muito Obrigado mais uma vez…

9 Respostas

R

Olá Bruno,

você já tem um processo definido?
por exemplo você pode armazenar os arquivos numa pasta x…, onde você pode criar um job em thread que fica lendo essa pasta de tempo em tempo, nessa pasta ele pega os arquivos, realiza a extração das informações conforme ja ocorre e grava os arquivos HGaBEND em uma pasta tal e para os arquivos HGERRO uma oiutra pasta tal. Será necessario sincronizar alguma parte do codigo para que processe e grave um arquivo por vez.

B

Rodrigo,

Desta forma que você explicou é bem interessante e que penso até em utilizá-la futuramente, pois no momento os arquivo eles não são gerados todos os dias e sim de semana em semana.

Porém o acumulador que havia comentado eu acho mais simples, por que ? por que depois que ele le todos os arquivos e separa as informações nos dois arquivos HGABEND e HGTERRO, eu pego estas informações já separas e as gravo em uma planilha excel em duas abas que já estão separadas como ABEND e ERROS, porém este processo eu ainda faço manual, pois preciso aprender um pouco de POI ou JexcelAPI na qual ainda tenho muita dificuldade.

Pois o que quero fazer é que o programa leia estes vários arquivos, separe as informações e logo após salve elas nestas duas abas da planilha excel.

Mas de primeiro momento, são tendo todas as informações salvas nos dois arquivos já está de bom tamanho.

Só que se você também puder me explicar sobre esta parte do thread como havia comentado, agradeço muito.

E muito obrigado pelo auxilio Rodrigo.

Abs…

B

Pessoal,

Sera que alguem poderia me ajudar com esta minha duvida sobre a questão de ler os arquivos, separar as informações e acumular em dois arquivos diferentes ?

Muito obrigado,

Bruno.

R

Separe o processamento em 3 etapas: o carregamento das linhas de cada arquivo, a separação entre linhas corretas e linha com erros e a gravação nos arquivos.

Para o carregamento dos arquivos, coloque os nomes dos arquivos em uma array ou List. Percorra os nomes dos arquivos abrindo cada arquivo separadamente, ao abrir leia as linhas do arquivo e coloque em uma única lista, que receberá todas as linhas. Ao final da primeira etapa todas as linhas dos arquivos ficam em uma única lista em memória.

Na segunda etapa, percorra essa lista separando as linhas corretas das erradas, em duas listas separadas.

Finalmente, grave cada lista em seus respectivos arquivos.

B

rmendes08,

Entao no caso, eu tenho que ter duas listas, uma para todos os arquivos e outra para os novos dados é isso?

E tenho que acessar cada indice do array tipo arquivo[0] e assim por diante ou estou errado ?:

Obrigado,

R

Não, o que eu disse é para:

1 - carregar todos os dados de todos os arquivos para a memória

2- separar as linhas válidas das linhas com erro

3 - gravar as linhas válidas e as linhas com erro em seus respectivos arquivos;

Quando trabalhamos com arquivos a prática mais comum é sempre carregar tudo para a memória , processar e gravar tudo de uma vez só. Para evitar ficar com referências de arquivos abertas. Isso só não é verdade quando os arquivos são grandes demais para caber na memória do programa, mas na maioria das vezes esse não é o caso.

B

Cara, infelizmente to quebrando a cabeça e ta dificil…não sou muito bom de programação, mas tento dar os meus pulos…será que não dá para você mostrar para mim um código apenas de leitura de todos os arquivos?

No caso, eu teria que ler todos eles e jogar em uma variáve ? separando no caso os abends de todos os arquivos em uma variavel e os outros erros em outra variavel ?

valeu

R

Vamos lá:

public class Main{
   public static void main(){
       String [] arquivosDeEntrada = {"abend1.txt" , "abend2.txt" , "abend3.txt" , "aben4.txt" , "aben5.txt"};

       List<String> linhasAbend = carregaLinhasDos(arquivosDeEntrada);


   }
}
B

rmendes08,

Cara, brigadão pela ajuda…mas depois de tanto quebrar a cabeça aqui, consegui fazer o que queria…

agora ele le todos os arquivos e separa para mim as informações que preciso em dois arquivos.

segue o código:

public void processamento() {   

		File arquivo[];
		File caminho = new File("C://ARQ_texto/Arquivos");
		
		arquivo = caminho.listFiles();
		
			String leitor = null;
			
		     for(int i = 0; i < arquivo.length;i++){
		    	 
		      try{

		         FileInputStream stream = new FileInputStream(arquivo[i]);     
		         InputStreamReader streamReader = new InputStreamReader(stream);     
		         BufferedReader reader = new BufferedReader(streamReader);     

		         FileWriter fileWriter = new FileWriter("HGAbend.txt",true);   
		         PrintWriter writer = new PrintWriter(fileWriter);     
		                  
		        
		         FileWriter filewriter1 = new FileWriter("HGErro.txt",true);   
		         PrintWriter writer1 = new PrintWriter(filewriter1);
		         
		         
		         
		         while( (leitor=reader.readLine() ) != null ) {     
                     
                     if (leitor.contains("ABENDED")){   
                             writer.println(leitor);   
                        }       
                     else {   
                             writer1.println(leitor);     
                            }   
                     }   
      
		         writer.close();     
		         fileWriter.close();     
		         reader.close();       
		         streamReader.close();     
		         stream.close(); 
		         
		         
		    }catch(IOException e){
		    	System.out.println("Arquivo não encontrado");
		    }
		  }	System.out.println("Processamento Concluído");	    	 
	   }
    }

Valeu.

Criado 30 de abril de 2011
Ultima resposta 30 de abr. de 2011
Respostas 9
Participantes 3