Problema com manipulação de arquivo texto

Delphi

04/10/2005

galera estou com um problema:

Estou fazendo uma comparação entre dois arquivos texto para saber quais registros estão no arquivo1 e não estão no arquivo2, mais no momento da comparacão está travando.

eis meu codigo:

(* ****************** Receber arquivo1*********************** *) 
lista1  :=  TStringList.Create;
                       // funçao que recebe e trata o arquivo2
      lista1.Text :=  RecebeEntrada(´C:\_DES\BackUp\nos.sem´).Text;
      lista1.Sort;
      Memo1.Text  :=  lista1.Text;

(* ****************** Receber arquivo2*********************** *) 
lista2  :=  TStringList.Create;
                       // funçao que recebe e trata o arquivo2
      lista2.Text :=  RecebeSaida(´C:\_DES\BackUp\09304001.r01´).Text;
      lista2.Sort;
      Memo2.Text  :=  lista2.Text;

(* ******************Comprara Arquivos********************** *) 
Resul :=  TStringList.Create;

    for i := 0 to lista1.Count - 1 do
      if lista2.IndexOf(lista1.Strings[i]) < 0 then
        Resul.Add(lista1.Strings[i]);

        memo3.Text  :=  Resul.Text;



Se alguem tiver alguma solução eu agradeço !!!!!!

um abraço a todos !!!


Fabiano Góes

Fabiano Góes

Curtidas 0

Respostas

Massuda

Massuda

04/10/2005

[quote:f41565fdc6=´Fabiano Góes´]mais no momento da comparacão está travando.[/quote:f41565fdc6]Imagino que você está dizendo que o seu programa congela por alguns instantes...

Como você já usa listas ordenadas (o que significa que o IndexOf usa busca binária) não sei se qualquer outra mudança ajudaria... eu faria apenas algumas pequenas modificações no seu código...
(* ****************** Receber arquivo1*********************** *) 
lista1  :=  TStringList.Create;
                       // funçao que recebe e trata o arquivo2
      lista1.LoadFromFile(´C:\_DES\BackUp\nos.sem´);
      lista1.Sort;

      Memo1.Lines.BeginUpdate;
      Memo1.Lines.AddStrings(lista1);
      Memo1.Lines.EndUpdate;

(* ****************** Receber arquivo2*********************** *) 
lista2  :=  TStringList.Create;
                       // funçao que recebe e trata o arquivo2
      lista2.LoadFromFile(´C:\_DES\BackUp\09304001.r01´);
      lista2.Sort;

      Memo2.Lines.BeginUpdate;
      Memo2.Lines.AddStrings(lista2);
      Memo2.Lines.EndUpdate;

(* ******************Comprara Arquivos********************** *) 
Resul :=  TStringList.Create;

    for i := 0 to lista1.Count - 1 do
      if lista2.IndexOf(lista1.Strings[i]) < 0 then
        Resul.Add(lista1.Strings[i]);

      Memo3.Lines.BeginUpdate;
      Memo3.Lines.AddStrings(Resul);
      Memo3.Lines.EndUpdate;

O .BeginUpdate e .EndUpdate evita que os memos sejam atualizados a cada linha inserida no memo e o .AddStrings evita perder tempo juntando todas as linhas em uma única string.


GOSTEI 0
Massuda

Massuda

04/10/2005

Depois que postei percebi que não tenho idéia do que seja RecebeEntrada e RecebeSaida no seu código original... o que são eles?


GOSTEI 0
Fabiano Góes

Fabiano Góes

04/10/2005

massuda


RecebeEntrada e RecebeSaida 


são duas funções que tratam os arquivos para deixa-los com o mesmo layout, pois os mesmo chegam em layout diferentes


GOSTEI 0
Fabiano Góes

Fabiano Góes

04/10/2005

massuda,
esta funcionando, só que estou achando meio lento ainda fiz um teste:

o arquivo1 = 6370(registros)

o arquivo2 = 5752(registros)

leva em média: 50 segundos para fazer a comparação,

[color=red:f6a7683d48][b:f6a7683d48]Será que está maneira que estou fazendo é a mais viável ?[/b:f6a7683d48][/color:f6a7683d48]


GOSTEI 0
POSTAR