INSERIR DE UM TXT PARA OUTRO
Necessito inserir dados de um arquivo txt para outro, conforme validação entre um e outro. Aqui no site têm o código abaixo que resolveu meu problema, mas em parte, pois o loop está muito lento, sendo que levaria horas para concluir o laço. Meus arquivos txt possuem 20.000 kb. Portanto alguém pode me ajudar a otimizar este código ou alguma outra sugestão?
Private Sub Command2_Click()
ComparaTXT App.Path & [Ô]/txt1.txt[Ô], App.Path & [Ô]/txt2.txt[Ô], App.Path & [Ô]/novoarquivo.txt[Ô]
End Sub
Public Function ComparaTXT(OriginalTXT As String, CompararTXT As String, NovoTXT As String)
Dim Arq1 As Integer
Dim Arq2 As Integer
Dim Arq3 As Integer
Dim OrigLine As String [ô] Linha Original
Dim CompLine As String [ô] Linha de Comparação
Arq2 = FreeFile
Open CompararTXT For Input As #Arq2 [ô] abre o segundo arquivo
Arq3 = FreeFile
Open NovoTXT For Output As #Arq3 [ô] abre o novo arquivo a ser salvo
Do While Not EOF(Arq2) [ô]Inicia o Loop no arquivo a se comparar
Line Input #Arq2, CompLine [ô] grava a linha em Compline - linha de comparação
Arq1 = FreeFile
Open OriginalTXT For Input As #Arq1 [ô]Abre o arquivo original que servira de base para consulta
Do While Not EOF(Arq1) [ô] inicia um novo Loop dentro do primeiro Loop
Line Input #Arq1, OrigLine [ô] grava a linha em OrigLine - linha de Origem
[ô]If CompLine = OrigLine Then
[ô]Print #Arq3, CompLine [ô] grava somente as semelhança dos arquivos 1 e 2 no arquivo 3
[ô]End If
If Mid(OrigLine, 1, 7) = Mid(CompLine, 11, 7) Then
Print #Arq3, OrigLine & Mid(CompLine, 4, 7) [ô]Then [ô] grava somente as semelhança dos arquivos 1 e 2 no arquivo 3
End If
Loop
Close #Arq1
Loop
Close #Arq2
Close #Arq3
End Function
Private Sub Command2_Click()
ComparaTXT App.Path & [Ô]/txt1.txt[Ô], App.Path & [Ô]/txt2.txt[Ô], App.Path & [Ô]/novoarquivo.txt[Ô]
End Sub
Public Function ComparaTXT(OriginalTXT As String, CompararTXT As String, NovoTXT As String)
Dim Arq1 As Integer
Dim Arq2 As Integer
Dim Arq3 As Integer
Dim OrigLine As String [ô] Linha Original
Dim CompLine As String [ô] Linha de Comparação
Arq2 = FreeFile
Open CompararTXT For Input As #Arq2 [ô] abre o segundo arquivo
Arq3 = FreeFile
Open NovoTXT For Output As #Arq3 [ô] abre o novo arquivo a ser salvo
Do While Not EOF(Arq2) [ô]Inicia o Loop no arquivo a se comparar
Line Input #Arq2, CompLine [ô] grava a linha em Compline - linha de comparação
Arq1 = FreeFile
Open OriginalTXT For Input As #Arq1 [ô]Abre o arquivo original que servira de base para consulta
Do While Not EOF(Arq1) [ô] inicia um novo Loop dentro do primeiro Loop
Line Input #Arq1, OrigLine [ô] grava a linha em OrigLine - linha de Origem
[ô]If CompLine = OrigLine Then
[ô]Print #Arq3, CompLine [ô] grava somente as semelhança dos arquivos 1 e 2 no arquivo 3
[ô]End If
If Mid(OrigLine, 1, 7) = Mid(CompLine, 11, 7) Then
Print #Arq3, OrigLine & Mid(CompLine, 4, 7) [ô]Then [ô] grava somente as semelhança dos arquivos 1 e 2 no arquivo 3
End If
Loop
Close #Arq1
Loop
Close #Arq2
Close #Arq3
End Function
Não se tem muito o que se OTIMIZAR em um ARQUIVO SEQUENCIAL.
Não sei exatamente como vc deseja melhorar o código com arquivos tão grandes, mas talvez haja uma maneira de se fazer um POG, lembrando que o código acima é de minha autoria.
então poste apenas umas tres linhas de cada arquivo texto que vc possui e o que deseja comparar, pra ver se posso lhe ajudar.
então poste apenas umas tres linhas de cada arquivo texto que vc possui e o que deseja comparar, pra ver se posso lhe ajudar.
Marcelo anexo o txt1 e o txt2. (no txt1 informo o que preciso)
Obs. Não preciso criar um terciro arquivo, somente incluir dados do txt2 no txt1, conforme critério de consulta entre o txt1 e o txt2.
Obs. Não preciso criar um terciro arquivo, somente incluir dados do txt2 no txt1, conforme critério de consulta entre o txt1 e o txt2.
Crie duas matrizes com os dados de cada arquivo.
Trabalhe em tempo de MEMÓRIA ao invés de utilizar o tempo de leitura sequencial.Crie o terceiro arrquivo com o resultado obtido.
Trabalhe em tempo de MEMÓRIA ao invés de utilizar o tempo de leitura sequencial.Crie o terceiro arrquivo com o resultado obtido.
Edemir, conforme sua sugestão, sobre matrizes acessei o artigo abaixo, têm alguma coisa sobre consulta binária, mas não estou saindo do chão...algum exemplo mas especÃfico de como criar matrizes em txt?
ALGORITMOS DE BUSCA EM TXT E MATRIZES PARTE1
ALGORITMOS DE BUSCA EM TXT E MATRIZES PARTE1
Utilize o código do MARCELO_TREZE. Leia cada linha do TXT e armazene em uma matriz. Compare as matrizes.
DIM Warq1() as string
Wtot = 0
Do While Not EOF(Arq2) [ô]Inicia o Loop no arquivo a se comparar
Line Input #Arq2, CompLine [ô] grava a linha em Compline - linha de comparação
Wtot = Wtot + 1
REDIM preserve Warq1(Wtot)
Warq1(Wtot) = CompLine
Loop
Sabe qual é o problema maior é o tempo que esta levando para se fazer isto.
então pela lógica da coisa:
se o txt1 tiver 30 mil linhas e txt2 tiver 25 mil linhas, a comparação será feita da seguinte maneria
primeira linha do txt2 com 1 linha do txt1 depois 2, 3 4 ....30.000
ou seja serão feitas 750 mil comparações, então não consigo ver possibilidades de diminuir esta consulta.
a modificação até é fácil o tempo de execução será definido pelo tamanho dos arquivos.
então pela lógica da coisa:
se o txt1 tiver 30 mil linhas e txt2 tiver 25 mil linhas, a comparação será feita da seguinte maneria
primeira linha do txt2 com 1 linha do txt1 depois 2, 3 4 ....30.000
ou seja serão feitas 750 mil comparações, então não consigo ver possibilidades de diminuir esta consulta.
a modificação até é fácil o tempo de execução será definido pelo tamanho dos arquivos.
Os teus dois arquivos tem o mesmo [Ô]indice[Ô]?
Ou seja, a primeira linha do primeiro arquivo equivale a primeira linha do segundo?
Se for assim, fica fácil usar um vetor.
Ou seja, a primeira linha do primeiro arquivo equivale a primeira linha do segundo?
Se for assim, fica fácil usar um vetor.
Se estes arquivos forem do tipo [Ô]campo delimitado[Ô], onde os campos tem uma largura fixa, ou são divididos por algum caracter especÃfico, vc pode usá-los como se fosse arquivos de dados através de um arquivo chave chamado Schema.ini.
Daà usaria com um simples comando a inserção dos dados:
Insert into txt3 (campo1, campo2, campo3) select campo1, campo2, campo3 from txt1 where campo1 = [ô]xxx[ô]
Vc encontra maiores informações sobre o schema.ini aqui e a connection string para ele aqui
Daà usaria com um simples comando a inserção dos dados:
Insert into txt3 (campo1, campo2, campo3) select campo1, campo2, campo3 from txt1 where campo1 = [ô]xxx[ô]
Vc encontra maiores informações sobre o schema.ini aqui e a connection string para ele aqui
[txt-size=2]CAMPANHA DEIXE NOSSO SITE LIMPO, FECHE SEU TÓPICO ASSIM QUE TIVER UMA RESPOSTA SATISFATÓRIA.[/txt-size]
Tópico encerrado , respostas não são mais permitidas