INSERIR DE UM TXT PARA OUTRO

MARCIOR 04/10/2009 00:30:12
#324342
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
TECLA 04/10/2009 10:05:39
#324346
Não se tem muito o que se OTIMIZAR em um ARQUIVO SEQUENCIAL.
MARCELO.TREZE 04/10/2009 11:00:13
#324351
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.
MARCIOR 04/10/2009 14:27:22
#324364
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.

EDERMIR 04/10/2009 22:05:40
#324391
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.
MARCIOR 04/10/2009 22:45:42
#324393
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
EDERMIR 05/10/2009 12:57:46
#324452
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
MARCELO.TREZE 05/10/2009 14:06:56
#324463
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.

ASHKATCHUP 05/10/2009 15:05:33
#324474
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.
KERPLUNK 06/10/2009 17:04:55
#324628
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
FOXMAN 18/03/2011 10:27:10
#368405
[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