Dúvida ao juntar dois arquivos TXT

É mais ou menos assim, deixa eu te explicar o que eu quero.

tenho que pegar cada linha do arquivo SEF pego sua subString(3,30) e procuro em cada linha do arquivo Registro60D se encontrar, pego toda a linha do arquivo Registro60D e a coloco no arquivo SEF(eu estou colocando em outro arquivo só para teste) só que ao inserir essa linha, ela vai pro final do arquivo, eu queria que ela ficasse logo abaixo da linha comparada. um exemplo:

60M[color=darkred]200802010000000000000000606[/color]0092D08857708871600048600300000000002756400000000204489046 00002042134060000000272715000000004636200000
60D[color=darkred]200802010000000000000000606[/color]337095 000000000100000000000000053900000000000000000 0000000000000
60D[color=darkred]200802010000000000000000606[/color]336625 000000000100000000000000064900000000000000000 0000000000000
60D[color=darkred]200802010000000000000000606[/color]322961 000000000100000000000000043900000000000000000 0000000000000
60D[color=darkred]200802010000000000000000606[/color]340341 000000000100000000000000049900000000000000000 0000000000000
60D[color=darkred]200802010000000000000000606[/color]338387 000000000100000000000000129900000000000000000 0000000000000
60D[color=darkred]200802010000000000000000606[/color]333915 000000000100000000000000079900000000000000000 0000000000000
60A200802010000000000000000606DESC000000002925
60A2008020100000000000000006061700000000272715
60M20080201SW0107000000000061360102D09718009728000049300400000000002464200000000224096583 00002238501630000000238210000000004049600000
60A20080201SW0107000000000061361700000000238210
60A20080201SW010700000000006136DESC000000008210

onde as linhas que iniciam com 60D fazem parte do arquivo registro60D

Esses arquivos possuem milhares de linhas, e tenho que inserir a linha 60D sempre abaixo da linha 60M!

Ah, agora entendi. O seu problema é que você está fazendo o relacionamento incorreto (ao contrário que deveria ser).
No seu caso, o arquivo Registro60D é muito grande? Se for grande, então preciso resolver de outro jeito.

Me diga o tamanho em bytes aproximado.

O arquivo 60D tem mais de 39 mil linhas!

Alguma sugestão?

39 mil linhas, cada linha com 100 colunas mais ou menos?

Você vai gastar algo como: 39.000 x 100 x 2 (porque cada caracter ocupa 2 bytes no Java), isso quer dizer um pouco menos de 8 megabytes, ou seja, não é nada que você precise acertar a configuração do Java para rodar seu programa. Eu faria algo parecido com o seguinte: (é óbvio que você vai ter de entender o programa e testar, não vou testar o programa para você):

E por favor, aprenda um pouquinho sobre mapas. Eles resolvem um monte de problemas que não se resolvem só com listas.

package guj;

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

public class ExemploLeituraArquivoSEF {
    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 o arquivo Registro60D
        BufferedReader reg60D = new BufferedReader(new FileReader(arquivoEntrada));
        SortedMap<String, List<String>> registros60D = new TreeMap<String, List<String>>();
        for (String linha = reg60D.readLine(); linha != null; linha = reg60D.readLine()) {
            if (linha.length() >= 30) {
                String codigo = linha.substring(3, 30);
                List<String> linhasComMesmoCodigo = registros60D.get(codigo);
                if (linhasComMesmoCodigo == null) {
                    linhasComMesmoCodigo = new ArrayList<String>();
                    registros60D.put(codigo, linhasComMesmoCodigo);
                }
                linhasComMesmoCodigo.add(linha);
            }
        }
        reg60D.close();

        // Lendo o arquivo SEF, correlacionando com o arquivo Registro60D, e escrevendo no arquivo de saída
        BufferedReader sef = new BufferedReader(new FileReader(arquivoSEF));
        PrintWriter saida = new PrintWriter(new BufferedWriter(new FileWriter(arquivoSaida)));
        for (String linha = sef.readLine(); linha != null; linha = sef.readLine()) {
            if (linha.length() >= 30) {
                String codigo = linha.substring(3, 30);
                saida.println(linha); // a linha original do arquivo SEF
                List<String> linhasComMesmoCodigo = registros60D.get(codigo);
                if (linhasComMesmoCodigo != null) {
                    for (String linhaReg60D : linhasComMesmoCodigo) {
                        saida.println(linhaReg60D); // cada uma das linhas do arquivo Registro60D que tem o mesmo código
                                                    // que aparece no arquivo SEF
                    }
                }
            }
        }
        saida.close();
        sef.close();
    }
}

Uma coisinha. No programa acima, estou supondo que se uma determinada linha do arquivo SEF tiver um código que não aparecer em nenhuma linha do arquivo Registro60D, ela ainda assim deve aparecer no arquivo final. É isso mesmo, ou então se não aparecer no arquivo Registro60D você tem de desprezar essa linha do arquivo SEF?

O conteúdo do arquivo SEF continua, o que tenho que fazer é adicionar o conteúdo do arquivo 60D ao SEF com as condições citadas anteriormente!

entanglement cara, muito obrigado por tua ajuda, vou seguir sua orientação e entender esse código ai, esse código que voce postou por ultimo está quase certo.
o problema dele é que está repetindo os valores, mas sua ajuda ja foi de grande valor, vou tentar corrigir. Muito obrigado mais uma vez!

Esse é o arquivo de saida que está gerando.

Essa deveria ser a saida!!!

“Ele está repetindo os valores” porque as linhas estão repetidas no arquivo SEF ou porque as linhas estão repetidas em 60D? Não estou com a menor vontade de analisar seu arquivo. Por favor, explique o que está repetido e deixe de ficar chorando porque não sabe pelo menos apontar os erros.

Você não especificou que era para remover as linhas repetidas que estão em 60D :slight_smile:

Se é para tirar as linhas repetidas em 60D, troque as referências a um List (e um ArrayList) que estão no código que postei, por um Set (e LinkedHashSet) . O resto deve ser igualzinho.

http://docs.oracle.com/javase/6/docs/api/java/util/Set.html
http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html

Cara eu não estou chorando! :wink:
só postei o arquivo pq pensei que voce quisesse saber o que fez. :thumbup: ja disse que vc ajudou muito e que vou desenrolar o resto.
valeu pela ajuda !

E ae Eduardo_nunes blz!
Você já conseguiu resolver o problema?!

Fiz um teste aqui, não sei se é exatamente isso que você gostaria, mas acho que dar um luz, espero que tenha ajudado


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;

public class LerDoisArquivoeComparar {

	public static void main(String[] args) throws FileNotFoundException {

		try {
			// pega os arquivos txt´s
			File file = new File("g:/scripts/CERTO2.txt");
			File file2 = new File("g:/scripts/CERTO1.txt");

			FileReader fileReader = new FileReader(file);
			BufferedReader bufferedReader = new BufferedReader(fileReader);

			FileReader fileReader2 = new FileReader(file2);
			BufferedReader bufferedReader2 = new BufferedReader(fileReader2);

			
				while (bufferedReader.ready()) {

					bufferedReader2.ready();

					String linha = bufferedReader.readLine(); // lê uma linha...
					String linha2 = bufferedReader2.readLine(); // lê uma linha...

					if (linha.toString().equals(linha2.toString())) { // verifica se as linhas são iguais
						System.out.println("igual");
						// #####################################################
						RandomAccessFile raf = new RandomAccessFile(
								"g:/scripts/daniel.txt", "rw");
						raf.seek(raf.length());
						raf.writeBytes(linha + "\r\n");
						raf.close();
						// ######################################################
						System.out.println(linha);
					} else {
						System.out.println("diferente");
					}
				}

			
		} catch (IOException e) {
			throw new RuntimeException(e);
		}

	}

}

abraços

[quote=snowblacksoul]E ae Eduardo_nunes blz!
Você já conseguiu resolver o problema?!

Fiz um teste aqui, não sei se é exatamente isso que você gostaria, mas acho que dar um luz, espero que tenha ajudado


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;

public class LerDoisArquivoeComparar {

	public static void main(String[] args) throws FileNotFoundException {

		try {
			// pega os arquivos txt´s
			File file = new File("g:/scripts/CERTO2.txt");
			File file2 = new File("g:/scripts/CERTO1.txt");

			FileReader fileReader = new FileReader(file);
			BufferedReader bufferedReader = new BufferedReader(fileReader);

			FileReader fileReader2 = new FileReader(file2);
			BufferedReader bufferedReader2 = new BufferedReader(fileReader2);

			
				while (bufferedReader.ready()) {

					bufferedReader2.ready();

					String linha = bufferedReader.readLine(); // lê uma linha...
					String linha2 = bufferedReader2.readLine(); // lê uma linha...

					if (linha.toString().equals(linha2.toString())) { // verifica se as linhas são iguais
						System.out.println("igual");
						// #####################################################
						RandomAccessFile raf = new RandomAccessFile(
								"g:/scripts/daniel.txt", "rw");
						raf.seek(raf.length());
						raf.writeBytes(linha + "\r\n");
						raf.close();
						// ######################################################
						System.out.println(linha);
					} else {
						System.out.println("diferente");
					}
				}

			
		} catch (IOException e) {
			throw new RuntimeException(e);
		}

	}

}

abraços[/quote]

Valeu, toda ajuda é bem vinda…
Mas estou quase terminando!!!