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
publicLerArquivo()throwsFileNotFoundException{Scannerleitor=newScanner(newFile("/home/aceneserra/Área de Trabalho/Registro60D.txt"));Scannersef=newScanner(newFile("/home/aceneserra/Área de Trabalho/SEF022008.txt"));List<String>linhas=newArrayList<String>();List<String>linhasSef=newArrayList<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(inti=0;i<vetorDeLinhas.length;i++){for(intj=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.
E
Eduardo_Nunes
o arquivo X tem 40000 linhas, não mostra todas no console, será se essa minha implementação está correta?
Rodrigo_Sasaki
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.
E
Eduardo_Nunes
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?
FileWriterfw=newFileWriter("/home/aceneserra/Área de Trabalho/SAIU.txt");BufferedWriterbw=newBufferedWriter(fw);if(vetorDeLinhasSef[j].toString().substring(3,30).equals(vetorDeLinhas[i].toString().substring(3,30))){bw.write(vetorDeLinhas[i].toString());}bw.close();
Rodrigo_Sasaki
A string retornada nas duas chamadas ao substring() realmente são iguais nas 40000 linhas?
E
Eduardo_Nunes
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? :?
Rodrigo_Sasaki
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 ?
E
Eduardo_Nunes
Uma média de 100 substrings(linhas) do arquivo X iguais 1 substring do arquivo Y
E
entanglement
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.
os que começam com 60D fazem parte do arquivo X e os com 60M e 60A do Y!
E
Eduardo_Nunes
É eu uso o eclipse no Linux
E
Eduardo_Nunes
Alguém poderia me ajuda?
E
Eduardo_Nunes
Alguém tem uma outra solução para se juntar esses dois arquivos?
Rodrigo_Sasaki
tentou dar um trim depois do substring pra ver se resolve? não sei se existem espaços sobrando por aí
E
Eduardo_Nunes
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)
publicPegar()throwsIOException{//CriaastreamparaleroarquivooriginalFileInputStreamfin=newFileInputStream("/home/aceneserra/Área de Trabalho/Registro60D.txt");FileInputStreamsef=newFileInputStream("/home/aceneserra/Área de Trabalho/SEF022008.txt");//CriaastreamparagravaroarquivodecópiaFileOutputStreamfout=newFileOutputStream("/home/aceneserra/Área de Trabalho/SAIDA.txt");//UsaasstreamsparacriaroscanaiscorrespondentesFileChannelin=fin.getChannel();FileChannelinSef=sef.getChannel();FileChannelout=fout.getChannel();//Númerodebytesdoarquivooriginallongnumbytes=in.size();longnumbytes1=inSef.size();//Transferetodoovolumeparaoarquivodecópia.in.transferTo(0,numbytes,out);inSef.transferTo(0,numbytes1,out);}
Como eu faço pra colocar esse valores em uma String pra poder passar o Split e quebrar linha por linha?
E
Eduardo_Nunes
Bom dia pessoal, ontem implementei uma outra solução que acredito que está quase lá!! :D
publicstaticvoidmain(String[]args)throwsFileNotFoundException,IOException{Scannerarquivo=newScanner(newFile("/home/aceneserra/Área de Trabalho/SEF022008.txt"));Scannerarquivo2=newScanner(newFile("/home/aceneserra/Área de Trabalho/Registro60D.txt"));List<String>listaSef=newArrayList<String>();List<String>lista60D=newArrayList<String>();while(arquivo.hasNextLine()){listaSef.add(arquivo.nextLine());}while(arquivo2.hasNextLine()){lista60D.add(arquivo2.nextLine());}for(inti=0;i<lista60D.size();i++){for(intj=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);}}}}
O problema é que ele salva 3 linhas repetidas de cada linha correta, alguém sabe como resolver esse "probleminha"?
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…
importjava.io.*;importjava.util.*;publicclassExemplo{publicstaticvoidmain(String[]args)throwsIOException{FilearquivoSEF=newFile("/home/aceneserra/Área de Trabalho/SEF022008.txt");FilearquivoEntrada=newFile("/home/aceneserra/Área de Trabalho/Registro60D.txt");FilearquivoSaida=newFile("/home/aceneserra/Área de Trabalho/CERTO.txt");// Carregando a lista de códigos do arquivo da SEFBufferedReadersef=newBufferedReader(newFileReader(arquivoSEF));SortedSet<String>codigosSEF=newTreeSet<String>();for(Stringlinha=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ídaBufferedReaderentrada=newBufferedReader(newFileReader(arquivoEntrada));PrintWritersaida=newPrintWriter(newBufferedWriter(newFileWriter(arquivoSaida)));for(Stringlinha=entrada.readLine();linha!=null;linha=entrada.readLine()){if(linha.length()>=30){Stringcodigo=linha.substring(3,30);if(codigosSEF.contains(codigo)){saida.println(linha);}}}saida.close();entrada.close();}}
E
Eduardo_Nunes
É 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:
onde as linhas que iniciam com 60D fazem parte do arquivo registro60D
E
Eduardo_Nunes
Esses arquivos possuem milhares de linhas, e tenho que inserir a linha 60D sempre abaixo da linha 60M!
E
entanglement
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.
E
entanglement
Me diga o tamanho em bytes aproximado.
E
Eduardo_Nunes
O arquivo 60D tem mais de 39 mil linhas!
E
Eduardo_Nunes
Alguma sugestão?
E
entanglement
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.
packageguj;importjava.io.*;importjava.util.*;publicclassExemploLeituraArquivoSEF{publicstaticvoidmain(String[]args)throwsIOException{FilearquivoSEF=newFile("/home/aceneserra/Área de Trabalho/SEF022008.txt");FilearquivoEntrada=newFile("/home/aceneserra/Área de Trabalho/Registro60D.txt");FilearquivoSaida=newFile("/home/aceneserra/Área de Trabalho/CERTO.txt");// Carregando o arquivo Registro60DBufferedReaderreg60D=newBufferedReader(newFileReader(arquivoEntrada));SortedMap<String,List<String>>registros60D=newTreeMap<String,List<String>>();for(Stringlinha=reg60D.readLine();linha!=null;linha=reg60D.readLine()){if(linha.length()>=30){Stringcodigo=linha.substring(3,30);List<String>linhasComMesmoCodigo=registros60D.get(codigo);if(linhasComMesmoCodigo==null){linhasComMesmoCodigo=newArrayList<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ídaBufferedReadersef=newBufferedReader(newFileReader(arquivoSEF));PrintWritersaida=newPrintWriter(newBufferedWriter(newFileWriter(arquivoSaida)));for(Stringlinha=sef.readLine();linha!=null;linha=sef.readLine()){if(linha.length()>=30){Stringcodigo=linha.substring(3,30);saida.println(linha);// a linha original do arquivo SEFList<String>linhasComMesmoCodigo=registros60D.get(codigo);if(linhasComMesmoCodigo!=null){for(StringlinhaReg60D: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();}}
E
entanglement
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?
E
Eduardo_Nunes
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!
E
Eduardo_Nunes
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!
E
Eduardo_Nunes
Esse é o arquivo de saida que está gerando.
E
Eduardo_Nunes
Essa deveria ser a saida!!!
E
entanglement
“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
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.
Cara eu não estou chorando!
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 !
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
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.io.RandomAccessFile;publicclassLerDoisArquivoeComparar{publicstaticvoidmain(String[]args)throwsFileNotFoundException{try{// pega os arquivos txt´sFilefile=newFile("g:/scripts/CERTO2.txt");Filefile2=newFile("g:/scripts/CERTO1.txt");FileReaderfileReader=newFileReader(file);BufferedReaderbufferedReader=newBufferedReader(fileReader);FileReaderfileReader2=newFileReader(file2);BufferedReaderbufferedReader2=newBufferedReader(fileReader2);while(bufferedReader.ready()){bufferedReader2.ready();Stringlinha=bufferedReader.readLine();// lê uma linha...Stringlinha2=bufferedReader2.readLine();// lê uma linha...if(linha.toString().equals(linha2.toString())){// verifica se as linhas são iguaisSystem.out.println("igual");// #####################################################RandomAccessFileraf=newRandomAccessFile("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(IOExceptione){thrownewRuntimeException(e);}}}
abraços
E
Eduardo_Nunes
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
importjava.io.BufferedReader;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.io.RandomAccessFile;publicclassLerDoisArquivoeComparar{publicstaticvoidmain(String[]args)throwsFileNotFoundException{try{// pega os arquivos txt´sFilefile=newFile("g:/scripts/CERTO2.txt");Filefile2=newFile("g:/scripts/CERTO1.txt");FileReaderfileReader=newFileReader(file);BufferedReaderbufferedReader=newBufferedReader(fileReader);FileReaderfileReader2=newFileReader(file2);BufferedReaderbufferedReader2=newBufferedReader(fileReader2);while(bufferedReader.ready()){bufferedReader2.ready();Stringlinha=bufferedReader.readLine();// lê uma linha...Stringlinha2=bufferedReader2.readLine();// lê uma linha...if(linha.toString().equals(linha2.toString())){// verifica se as linhas são iguaisSystem.out.println("igual");// #####################################################RandomAccessFileraf=newRandomAccessFile("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(IOExceptione){thrownewRuntimeException(e);}}}
abraços
Valeu, toda ajuda é bem vinda…
Mas estou quase terminando!!!