Fórum Ajuda para comparar os dados de dois memos. #372510
21/07/2009
0
Estou tentando comparar os dados de dois memos e fazer um terceiro receber uma cópia do segundo com o maior número de dados iguais encontrados em cada linha da pesquisa. Por exemplo:
Memo1 ...................... Memo2
13;17;10;13;27;30 -- 01;02;03;04;05;06
10;09;16;20;21;43 -- 02;03;04;05;06;07
01;02;03;04;05;06 -- 03;04;05;06;07;08
16;18;26;27;34;40 -- 04;05;06;07;08;09
O que gostaria que ele retornasse seria isso:
01;02;03;04;05;06 -> 6
02;03;04;05;06;07 -> 5
03;04;05;06;07;08 -> 4
04;05;06;07;08;09 -> 3
Mas o que estou recebendo como retorno é:
01;02;03;04;05;06 -> 0
02;03;04;05;06;07 -> 0
03;04;05;06;07;08 -> 4
04;05;06;07;08;09 -> 0
Só consegui fazer a comparação da primeira com a primeira e segunda com segunda linha e assim por diante não sei como fazer para comparar a primeira linha do segundo memo com todas do primeiro e dai partir para a segunda...
Se vocês puderem me ajudar... o código está assim:
unit U_Conferir;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TF_Conferir = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
F_Conferir: TF_Conferir;
vec,tot: array of integer;
implementation
{$R *.dfm}
function conferir(const a, b: array of integer):integer;
var
contem, x, y: integer;
begin
contem:= 0;
for x:=0 to high(a) do begin
for y:=0 to high(b) do begin
if a[x]=b[y] then
contem:=contem+1
end;
end;
Result:=contem;
end;
procedure TF_Conferir.FormCreate(Sender: TObject);
begin
memo1.Lines.Clear;
memo2.Lines.Clear;
memo3.Lines.Clear;
end;
procedure TF_Conferir.Button1Click(Sender: TObject);
begin
if OpenDialog1.execute then
Memo1.Lines.LoadFromFile(OpenDialog1.filename)
end;
procedure TF_Conferir.Button2Click(Sender: TObject);
begin
if OpenDialog1.execute then
Memo2.Lines.LoadFromFile(OpenDialog1.filename)
end;
procedure TF_Conferir.Button3Click(Sender: TObject);
var
x: integer;
begin
SetLength(vec,6);
memo3.Lines.Clear;
for x:=0 to memo1.lines.Count-1 do begin
vec[0]:=strtointdef(copy(memo1.Lines.Strings[x],1,2),0);
vec[1]:=strtointdef(copy(memo1.Lines.Strings[x],4,2),0);
vec[2]:=strtointdef(copy(memo1.Lines.Strings[x],7,2),0);
vec[3]:=strtointdef(copy(memo1.Lines.Strings[x],10,2),0);
vec[4]:=strtointdef(copy(memo1.Lines.Strings[x],13,2),0);
vec[5]:=strtointdef(copy(memo1.Lines.Strings[x],16,2),0);
setlength(tot,6);
tot[0]:=strtointdef(copy(memo2.Lines.Strings[x],1,2),0);
tot[1]:=strtointdef(copy(memo2.Lines.Strings[x],4,2),0);
tot[2]:=strtointdef(copy(memo2.Lines.Strings[x],7,2),0);
tot[3]:=strtointdef(copy(memo2.Lines.Strings[x],10,2),0);
tot[4]:=strtointdef(copy(memo2.Lines.Strings[x],13,2),0);
tot[5]:=strtointdef(copy(memo2.Lines.Strings[x],16,2),0);
Memo3.lines.add(memo2.lines.Strings[x]+´ -> ´+IntToStr(conferir(vec,tot)));
end;
end;
end.Willer_sh
Curtir tópico
+ 0Posts
21/07/2009
Osocram
Pq seguindo o que vc escreveu
Memo1 ...................... Memo2 13;17;10;13;27;30 -- 01;02;03;04;05;06 10;09;16;20;21;43 -- 02;03;04;05;06;07 [b]01;02;03;04;05;06 -- 03;04;05;06;07;08[/b] 16;18;26;27;34;40 -- 04;05;06;07;08;09
somente na terceira linha é que temos repetição
01;02;03;04;05;06 -- 03;04;05;06;07;08
no qual se repetem os numeros 03;04;05;06
então:
Mas o que estou recebendo como retorno é: 01;02;03;04;05;06 -> 0 02;03;04;05;06;07 -> 0 03;04;05;06;07;08 -> 4 04;05;06;07;08;09 -> 0
isso que vc tem como retorno esta correto.
na sua logica vc esta pegando o primeiro numero a lista um e compara com todos da segunda lista, se achar um igual vc aumenta o contador.
Gostei + 0
22/07/2009
Willer_sh
Gostei + 0
22/07/2009
Osocram
Eu tive q ler umas 6x este seu ultimo post p enteder.. eu lia entendia, qdo olhava o exemplo via que não tinha entendido...
XD
Mas agora sim fui lendo pedaço por pedaço e ohando o seu exemplo...
Agora entendi.
Na verdade vc quer pegar cada linha do Memo2, e achar em qual linha do memo1 q eles mais se repetem e trazer a qtd.
bom.... agora ta uma correria aqui... mas assim que der vou tentar te ajudar no algoritmo..
Gostei + 0
22/07/2009
Osocram
cria um memo3 apenas p teste, adiciona um botao e no Click do botão coloque este codigo
Memo3.Lines.Delimiter := ´;´; Memo3.Lines.DelimitedText := Memo2.Lines[0];
vc vai ver q este comando ele vai pegar uma linha do seu memo2 (a primeira linha), e usando o ´;´ como delimitador vai adicionar no memo3 cada algarismo que vc quer comparar em uma linha, assim vc não precisa ficar se matando p fazer os arrays.
tente bolar uma logica com isso...
Para cada linha do memo2 vc vai ter q comparar com todas as linhas do memo1.
Gostei + 0
22/07/2009
Willer_sh
Gostei + 0
28/07/2009
Willer_sh
Gostei + 0
28/07/2009
Willer_sh
Gostei + 0
28/07/2009
Emerson Nascimento
var imemo1, imemo2, islist, ncont, nmaior: integer; slinha: string; st: TStringList; begin st := TStringList.Create; st.Delimiter := ´;´; Memo3.Clear; // novo memo que irá receber o resultado for imemo2 := 0 to Memo2.Lines.Count - 1 do begin st.DelimitedText := Memo2.Lines[imemo2]; nmaior := 0; for imemo1 := 0 to Memo1.Lines.Count - 1 do begin ncont := 0; slinha := Memo1.Lines[imemo1]; for islist := 0 to st.Count - 1 do if Pos(st[islist], slinha) > 0 then Inc(ncont); if ncont > nmaior then nmaior := ncont; end; // joga o resultado num novo memo Memo3.Lines.Add(Memo2.Lines[imemo2]+´ -> ´+inttostr(nmaior)); // // ou altera o memo 2 e acrescenta o resultado // Memo2.Lines[imemo2] := Memo2.Lines[imemo2]+´ -> ´+inttostr(nmaior); end; end;
Gostei + 0
29/07/2009
Willer_sh
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)