Dúvida ao juntar dois arquivos TXT

Bom dia pessoal,
estou fazendo um programa para pegar parte do conteúdo um arquivo X.txt comparar com parte do conteúdo do arquivo Y.txt e se for igual inserir em um arquivo Z.txt

public LerArquivo() throws FileNotFoundException{
		    Scanner leitor = new Scanner(new File("/home/aceneserra/Área de Trabalho/Registro60D.txt"));
		    Scanner sef = new Scanner(new File("/home/aceneserra/Área de Trabalho/SEF022008.txt"));
		    List<String> linhas = new ArrayList<String>();  
		    List<String> linhasSef = new ArrayList<String>();  
		    while (sef.hasNextLine()){
		    	linhasSef.add(sef.nextLine());
		    }
		    sef.close();
		    while (leitor.hasNextLine()) {  
		        linhas.add(leitor.nextLine());  
		    }  
		    leitor.close();  
		      
		    Object[] vetorDeLinhas =  linhas.toArray();  
		    Object[] vetorDeLinhasSef =  linhasSef.toArray();    		

		    for(int i= 0; i<vetorDeLinhas.length; i++){
		    	for(int j=0; j<vetorDeLinhasSef.length; j++){
	   		   	 	
		    		if(vetorDeLinhasSef[j].toString().substring(3, 30).equals(vetorDeLinhas[i].toString().substring(3, 30))){
	   		   	 		System.out.println(vetorDeLinhasSef[j].toString().substring(3, 30)+"   "+vetorDeLinhas[i].toString().substring(3, 30));
	   		   	 	}
		    }
		    }
	   	        	
	}

como eu salvo esses dois arquivo em um só? acho que só falta isso!

Crie um PrintWriter, ou BufferedWriter ou seja lá qual for o que você prefere e escreva o texto no seu terceiro arquivo.

Se tem dúvidas sobra a manipulação de arquivos leia este artigo do GUJ.

o arquivo X tem 40000 linhas, não mostra todas no console, será se essa minha implementação está correta?

Algumas IDEs mantém o console com tamanho limitado, você pode ou tirar/alterar esse limite, ou escrever os dados no arquivo e ver se sai como você quer.

Gravei o arquivo Z.txr mas ele grava com 3 linhas iguais a cada linha do arquivo X.txt, e não grava todas as 40000 grava só 126.
acho que minha lógica desse for ta errada, poderia me ajudar?

[code]
FileWriter fw = new FileWriter("/home/aceneserra/Área de Trabalho/SAIU.txt");
BufferedWriter bw = new BufferedWriter(fw);
if(vetorDeLinhasSef[j].toString().substring(3, 30).equals(vetorDeLinhas[i].toString().substring(3, 30))){

	    			bw.write(vetorDeLinhas[i].toString());
	    			
   		   	 	} 

bw.close(); [/code]

A string retornada nas duas chamadas ao substring() realmente são iguais nas 40000 linhas?

Não, acho que me expressei mal!

eu pego as linhas do arquivo X(40000) uma por uma comparo com as linhas do arquivo Y (30), se forem iguais adiciono as duas no arquivo Z!

Da pra entender? :?

Tudo bem, mas minha pergunta ainda é válida.

Quantas linhas você quer que sejam impressas no arquivo Z? tem uma ideia ou uma média?

Esse no caso não seria o resultado correto ?

Uma média de 100 substrings(linhas) do arquivo X iguais 1 substring do arquivo Y

O console do Eclipse (você está usando o Eclipse) ou o console do Windows costuma mostrar apenas uma quantidade limitada de linhas, para evitar problemas de estourar a memória.

[code]Por exemplo

conteudo X.txt conteudo Y.txt conteudo Z.txt
apenas substring(3,31) apenas substring(3,31) string completa
2008010100001 2008010100001 60M 2008010100001…
2008010100001 2008010101212 60A 2008010100001…
2008010100001 2009999999991 60D 2008010100001…
2008010100001 60D 2008010100001…
2009999999991 60D 2008010100001…
2009999999991 60D 2008010100001…
60M 2009999999991…
60A 2009999999991…
60D2009999999991…
60D 2009999999991…
[/code]

os que começam com 60D fazem parte do arquivo X e os com 60M e 60A do Y!

É eu uso o eclipse no Linux :slight_smile:

Alguém poderia me ajuda?

Alguém tem uma outra solução para se juntar esses dois arquivos?

tentou dar um trim depois do substring pra ver se resolve? não sei se existem espaços sobrando por aí

Cara, andei pesquisando, e vi que usar I/O para arquivos enormes não é muito bom, recomenda-se usar a new I/O comecei a fazer aqui denovo, mas me surgiu uma dúvida aqui (coisa de principiante)

[code]
public Pegar() throws IOException{
// Cria a stream para ler o arquivo original
FileInputStream fin = new FileInputStream("/home/aceneserra/Área de Trabalho/Registro60D.txt");
FileInputStream sef = new FileInputStream("/home/aceneserra/Área de Trabalho/SEF022008.txt");

		   // Cria a stream para gravar o arquivo de cópia  
		   FileOutputStream fout = new FileOutputStream("/home/aceneserra/Área de Trabalho/SAIDA.txt");  
		     
		   // Usa as streams para criar os canais correspondentes  
		   FileChannel in = fin.getChannel();  
		   FileChannel inSef = sef.getChannel(); 
		   FileChannel out = fout.getChannel();  
		  
		   // Número de bytes do arquivo original  
		   long numbytes = in.size();         
		   long numbytes1 = inSef.size();         
		     
		  
		   // Transfere todo o volume para o arquivo de cópia.   
		   in.transferTo(0, numbytes, out);
		   inSef.transferTo(0,numbytes1,out);   
	}[/code]

Como eu faço pra colocar esse valores em uma String pra poder passar o Split e quebrar linha por linha?

Bom dia pessoal, ontem implementei uma outra solução que acredito que está quase lá!! :smiley:

[code]public static void main(String[] args) throws FileNotFoundException, IOException{
Scanner arquivo = new Scanner(new File("/home/aceneserra/Área de Trabalho/SEF022008.txt"));
Scanner arquivo2 = new Scanner(new File("/home/aceneserra/Área de Trabalho/Registro60D.txt"));

        List<String> listaSef = new ArrayList<String>();  
        List<String> lista60D = new ArrayList<String>();

        while (arquivo.hasNextLine()) {  
                   listaSef.add(arquivo.nextLine());  
               }  
               while (arquivo2.hasNextLine()) {  
                   lista60D.add(arquivo2.nextLine());  
               }  
               	for(int i=0; i<lista60D.size(); i++){
               		for (int j=0;j<listaSef.size();j++){
               			if(lista60D.get(i).substring(3, 30).equals(listaSef.get(j).substring(3, 30))){
               				
       
               				salvar("/home/aceneserra/Área de Trabalho/CERTO.txt", lista60D.get(i)+"\n", true);
               			}
               			
               		}
               		
               	}
           
      } 
      			
    	
      [/code]

O problema é que ele salva 3 linhas repetidas de cada linha correta, alguém sabe como resolver esse “probleminha”?

Como é o método “salvar” ?

[code]public static void salvar(String arquivo, String conteudo, boolean adicionar)
throws IOException {

	        FileWriter fw = new FileWriter(arquivo, adicionar);

	        fw.write(conteudo);
	        fw.close();
	    }[/code]

O programa abaixo deve fazer a mesma coisa que você está querendo fazer, mas de maneira mais rápida e que gasta bem menos memória. Isso pode ser importante se você tem um arquivo “Registro60D.txt” com mais de 16 MB de tamanho…

import java.io.*;
import java.util.*;

public class Exemplo {
    public static void main (String[] args) throws IOException {
		File arquivoSEF = new File ("/home/aceneserra/Área de Trabalho/SEF022008.txt");
		File arquivoEntrada = new File ("/home/aceneserra/Área de Trabalho/Registro60D.txt");
		File arquivoSaida = new File ("/home/aceneserra/Área de Trabalho/CERTO.txt");
		
		// Carregando a lista de códigos do arquivo da SEF
		BufferedReader sef = new BufferedReader (new FileReader (arquivoSEF));
		SortedSet <String> codigosSEF = new TreeSet <String> ();
		for (String linha = sef.readLine(); linha != null; linha = sef.readLine()) {
			if (linha.length() >= 30)
				codigosSEF.add (linha.substring(3, 30)); 
		}
		sef.close();

		// Lendo o arquivo de entrada e escrevendo no arquivo de saída
		BufferedReader entrada = new BufferedReader (new FileReader (arquivoEntrada));
		PrintWriter saida = new PrintWriter (new BufferedWriter (new FileWriter (arquivoSaida)));
		for (String linha = entrada.readLine(); linha != null; linha = entrada.readLine()) {
			if (linha.length() >= 30) {
				String codigo = linha.substring (3, 30);
				if (codigosSEF.contains (codigo)) {
					saida.println (linha);
				}
			}
		}
		saida.close();
		entrada.close();
	}
}