BUSCA POR LINHAS REPETIDAS EM ARQUIVO TXT

MATHEUSSDO 12/12/2013 14:31:50
#432026
Boa tarde galera... Estou precisando de um help é o seguinte:
Tenho um arquivo TXT, que tem várias linhas...

Todas elas tem o mesmo tamanho máximo

O que eu preciso, é percorrer este arquivo TXT, removendo as linhas repetidas e deixando somente 1 original.

Só que assim, supondo estou na primeira linha, vou ver todas as linhas DEPOIS dessa linha atual e apagar os repetidos.

Segunda linha, apagar TODAS as linhas iguais depois desta segunda linha.

Alguém pode me ajudar ?
FILMAN 12/12/2013 14:45:23
#432027
Olá, amigo

Perguntas:

1ª:
Você sabe abrir e ler um arquivo .txt?

2ª:
Você sabe grava/criar um novo arquivo?

3ª:
Outra coisa o que você já tem pronto?


Por favor nos responda que assim ficará mais fácil de te ajudar!

MATHEUSSDO 12/12/2013 15:02:33
#432029
Boa tarde amigo...
Sim, eu vou postar um trecho aqui

Set ts = fso.OpenTextFile(txtCaminho.Text)
n = FreeFile

Open txtCaminho.Text For Input As #1
Do Until EOF(1)
Line Input #1, Linha
[ô]AQUI
Loop
Close #1

Minha dúvida maior é tanto na lógica como também no código:
Onde eu coloquei [ô]AQUI, é que eu pensei que eu deveria comprar a linha atual que eu tenho com todas as linhas abaixo dela..
Pensei em jogar tudo em um array, porém não consegui fazer muito progresso porque este arquivo tem um tamanho indefinido, não tenho um tamanho máximo de linhas...

E não consigo fazer por tabelas temporárias, pois é assim: Tenho 5 linhas que tem 10 campos, depois 10 linhas que tem 20 campos, e por ai vai, o tamanho de campos de cada linha é diferente..

Porém todas as linhas tem o mesmo tamanho, a diferença é que quando acaba os campos eu preencho com espaço em branco. Todas as linhas tem no maximo 127 caracteres

KERPLUNK 12/12/2013 15:20:00
#432033
Mostre o formato desse arquivo, talvez possa ser aberto como base de dados ADO
MATHEUSSDO 12/12/2013 15:23:48
#432034
Não sei se ele vai exibir aqui da mesma forma que no bloco de notas, mas vamos lá:
cada linha que começa com 50 está certo

E tenho também as linhas que começam com 75.. MAS, somente 1 de cada linha pode aparecer... Tem um campo em cada linha
75 que difere das outras, mas algumas linhas se repetem, preciso retirar essas que se repetem

5060629202005700209132694113 20131107SP551 0000645920P000000720000000000000000000000000000000000000000000000000072000000000N
5060629202005700209132694113 20131113SP551 0000655920P000000650000000000000000000000000000000000000000000000000065000000000N
5460629202005700551 00006459200000017100 000000160000000016000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000027104 000000020000000002000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000037106 000000040000000004000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000047106 000000020000000002000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000057127 000000010000000001000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000067107 000000060000000006000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000077108 000000050000000005000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000087110 000000060000000006000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000097112 000000150000000015000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000107114 000000120000000012000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006459200000117115 000000030000000003000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000017100 000000170000000017000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000027101 000000020000000002000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000037106 000000030000000003000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000047106 000000010000000001000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000057127 000000010000000001000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000067107 000000040000000004000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000077108 000000010000000001000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000087108 000000110000000011000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000097110 000000030000000003000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000107110 000000020000000002000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000117114 000000140000000014000000000000000000000000000000000000000000000000000000000
5460629202005700551 00006559200000127115 000000060000000006000000000000000000000000000000000000000000000000000000000
7520131101201311307100 28044000CIL. OXIGENIO, COMPRIMIDO ONU 1072 2.2/5.1 N.A - INDUCI 000000000000000000000000000
7520131101201311307104 28044000CIL. OXIGENIO, COMPRIMIDO ONU 1072 2.2/5.1 N.A - INDUCI 000000000000000000000000000
7520131101201311307106 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A CI 000000000000000000000000000
7520131101201311307106 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A CI 000000000000000000000000000
7520131101201311307127 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A - 3 KG CI 000000000000000000000000000
7520131101201311307107 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A - CARGA CI 000000000000000000000000000
7520131101201311307108 28042100CIL. ARGONIO, COMPRIMIDO ONU 1006 2.2 N.A CI 000000000000000000000000000
7520131101201311307110 28043000CIL. NITROGENIO, COMPRIMIDO ONU 1066 2.2 N.A CI 000000000000000000000000000
7520131101201311307112 28112100CIL. DIOXIDO DE CARBONO ONU 1013 - 2.2 N.A CI 000000000000000000000000000
7520131101201311307114 28046900CIL. MISTURA DE GASES RAROS, COMPRIMIDO ONU 1979 2.2 CI 000000000000000000000000000
7520131101201311307115 28046900CIL. MISTURA DE GASES RAROS, COMPRIMIDO ONU 1979 2.2 CI 000000000000000000000000000
7520131101201311307100 28044000CIL. OXIGENIO, COMPRIMIDO ONU 1072 2.2/5.1 N.A - INDUCI 000000000000000000000000000
7520131101201311307104 28044000CIL. OXIGENIO, COMPRIMIDO ONU 1072 2.2/5.1 N.A - INDUCI 000000000000000000000000000
7520131101201311307106 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A CI 000000000000000000000000000
7520131101201311307106 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A CI 000000000000000000000000000
7520131101201311307127 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A - 3 KG CI 000000000000000000000000000
7520131101201311307107 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A - CARGA CI 000000000000000000000000000
7520131101201311307108 28042100CIL. ARGONIO, COMPRIMIDO ONU 1006 2.2 N.A CI 000000000000000000000000000
7520131101201311307110 28043000CIL. NITROGENIO, COMPRIMIDO ONU 1066 2.2 N.A CI 000000000000000000000000000
7520131101201311307112 28112100CIL. DIOXIDO DE CARBONO ONU 1013 - 2.2 N.A CI 000000000000000000000000000
7520131101201311307114 28046900CIL. MISTURA DE GASES RAROS, COMPRIMIDO ONU 1979 2.2 CI 000000000000000000000000000
7520131101201311307115 28046900CIL. MISTURA DE GASES RAROS, COMPRIMIDO ONU 1979 2.2 CI 000000000000000000000000000
7520131101201311307100 28044000CIL. OXIGENIO, COMPRIMIDO ONU 1072 2.2/5.1 N.A - INDUCI 000000000000000000000000000
7520131101201311307104 28044000CIL. OXIGENIO, COMPRIMIDO ONU 1072 2.2/5.1 N.A - INDUCI 000000000000000000000000000
7520131101201311307106 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A CI 000000000000000000000000000
7520131101201311307106 29012900CIL. ACETILENO, DISSOLVIDO ONU 1001 2.1 N.A CI 000000000000000000000000000
KERPLUNK 12/12/2013 15:45:11
#432037
Ok, essas linhas são os mesmos tipos de dados? Tipo, tem campos, ainda que definidos por tamanho? Ou depende do início da linha que define o que cada linha é?
MATHEUSSDO 12/12/2013 15:49:45
#432039
Cada linha é uma informação de um produto... Cada linha tem alguns campos por exemplo:
75 = Tipo de linha
20131101 = Data inicio
20131130 = Data final
7106 = Código do Produto

e por ai vai

Preciso mesmo é comprar se existe linhas que contém este campo = Código do Produto (exemplo do 7106)

Se já existir uma linha com esse código, então eu tenho que deixar somente 1 linha dessa...

OCELOT 12/12/2013 16:08:05
#432040
Falando apenas de lógica, eu diria se você não quer linhas repetidas no arquivo final o que você deve fazer não é comparar a linha atual com as próximas linhas, isso não garante que ela seja única, pode ser que já tenha alguma outra antes dela.

O que você deveria fazer é ver se a linha atual já foi gravada no outro arquivo, o loop deveria seguir uma lógica do tipo

Lê a próxima linha do arquivo de origem
Verifica se já gravou um linha igual a esta no arquivo de destino
Se já gravou ignora a linha atual
Se ainda não gravou uma linha igual a esta então grava ela no arquivo de destino
Passa para a próxima linha do arquivo de origem e começa tudo de novo

Leve em consideração que se você quer alterar o próprio arquivo você não vai conseguir apagar linhas dele, você deve regravar ele inteiro, então é mais fácil criar um arquivo novo e depois substituir o antigo. Se os arquivos não forem grandes demais você poderia também manter os dados dele em memória, para só precisar ler as linhas uma vez do disco, mas cabe a você saber fazer isso.

E outra coisa, porque você está usando o FileSystemObject para abrir o arquivo se está depois usando o comando Open para fazer o mesmo de novo? Você deveria usar apenas um dos dois.

E se estiver muito difícil fazer isso direto nos arquivos você sempre tem a opção de importar todos os dados para um banco de dados e usar um SELECT DISTINCT (ou equivalente dependendo do banco de dados usado) para trazer apenas os registros não repetidos
FILMAN 12/12/2013 21:06:55
#432047
[ô]Veja se te ajuda, claro que pode ser melhorado! E outra coisa não testei escrevi diretamente aqui

Private Sub LerArquivoGravar()
Dim F As Integer, F1 As Integer
Dim Linha As String, Linha1 As String
Dim pGravar As Boolean

F = FreeFile

Open txtCaminho.Text For Input As #F
While Not EOF(F)
Line Input #F, Linha

If Int(Left(Trim(Linha), 2)) = 75 Then
F1 = FreeFile
pGravar = True

Open [Ô]C:\Temp\SeuArquivo.txt[Ô] For Input As #F1
While Not EOF(F)
Line Input #F1, Linha1

If Int(Left(Trim(Linha1), 2)) = 75 Then
If UCase(Trim(Linha)) = UCase(Trim(Linha1)) Then
pGravar = False
End If
End If
Wend
Close #F1

If pGravar Then
Call GravarNovo(Linha)
End If
Else
Call GravarNovo(Linha)
End If

Wend
Close #F
End Sub

Private Sub GravarNovo(vTexto)
[ô]Utilizado para gravar os dados no novo arquivo
Dim F As Integer

F = FreeFile

Open [Ô]C:\Temp\SeuArquivo.txt[Ô] For Append Shared As #F
Print #F, vTexto
Close #F
End Sub


[ô]Para chamar o procedimento coloque a linha abaixo dentro do click de um botão

Call LerArquivoGravar



Espero te ajudado
MATHEUSSDO 13/12/2013 10:43:04
#432057
Filman

Obrigado pela ajuda, não testei porque achei uma solução.. Vou postar aqui

Tenho esse comando dentro de um Click

Open txtCaminho.Text For Output As #2
For i = 0 To List1.ListCount - 1
List1.ListIndex = i
If Left(List1.Text, 2) = [Ô]75[Ô] Then Qtde_registro_75 = Qtde_registro_75 + 1
If Left(List1.Text, 2) = [Ô]90[Ô] Then
Teste = Replace(List1.Text, Format(vTipo75, [Ô]0000000[Ô]), Format(Qtde_registro_75, [Ô]0000000[Ô]))
Print #2, Teste
Else
Print #2, List1.Text
End If
Qtde_Linhas = Qtde_Linhas + 1
Next
Close #2


Que chama esta função:

Public Function Reptido(Palavra As String, Lista As ListBox, Optional Qtde_registro_75 As Integer) As Boolean
Dim Counter As Long
[ô]Qtde_registro_75 = 0
For i = 0 To Lista.ListCount
DoEvents
[ô]If Left(Palavra, 2) = [Ô]75[Ô] Then Qtde_registro_75 = Qtde_registro_75 + 1
If Palavra = Lista.List(i) Then Counter = Counter + 1
Next i
If Counter > 0 Then Let Reptido = True
End Function


Obrigado a todos que tentaram ajudar
FILMAN 13/12/2013 13:52:57
#432066
Bom se o seu problema foi solucionado ficamos contentes, portanto encerre o tópico!


Obrigado
Tópico encerrado , respostas não são mais permitidas