Ajuda para comparar os dados de dois memos.
Tudo bem pessoal?? Espero que possam me ajudar com essa dificuldade, ainda estou engatinhando no Delphi...
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:
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
Curtidas 0
Respostas
Osocram
21/07/2009
Acho que não entendi o que vc quer fazer...
Pq seguindo o que vc escreveu
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:
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.
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
Willer_sh
21/07/2009
Então Osocram, desculpa não consegui passar o que quero direito, é o seguinte, da forma como está eu consigo comparar a primeira linha do memo1 com a primeira do memo2, a segunda com a segunda, terceira com terceira, e assim por diante. O que quero é pegar a primeira linha do memo2 e procurar a com maior número de valores iguais, que seria a terceira com 6 números iguais, se pegasse a quarta linha do memo2 primeiro acharia uma igualdade na segunda linha do memo1 o número 9 depois três os números 04 05 06 na terceira linha, então me retornaria três em vez de um já que é o maior número de termos iguais. Acho que com mais um laço lendo só o memo2 de certo vou tentar... valeu, é isso... obirgado pela atenção...
GOSTEI 0
Osocram
21/07/2009
ahuahua
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..
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..
Então Osocram, desculpa não consegui passar o que quero direito, é o seguinte, da forma como está eu consigo comparar a primeira linha do memo1 com a primeira do memo2, a segunda com a segunda, terceira com terceira, e assim por diante. O que quero é pegar a primeira linha do memo2 e procurar a com maior número de valores iguais, que seria a terceira com 6 números iguais, se pegasse a quarta linha do memo2 primeiro acharia uma igualdade na segunda linha do memo1 o número 9 depois três os números 04 05 06 na terceira linha, então me retornaria três em vez de um já que é o maior número de termos iguais. Acho que com mais um laço lendo só o memo2 de certo vou tentar... valeu, é isso... obirgado pela atenção...
GOSTEI 0
Osocram
21/07/2009
para te ajudar um pouco
cria um memo3 apenas p teste, adiciona um botao e no Click do botão coloque este codigo
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.
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
Willer_sh
21/07/2009
Valeu, vou tentar com a sua dica...
GOSTEI 0
Willer_sh
21/07/2009
sem sucesso, ainda, se conseguir resolver posto o resultado, e se alguém tiver outras dicas que possam ajudar por favor... valeu galera!!!
GOSTEI 0
Willer_sh
21/07/2009
sem sucesso, ainda, se conseguir resolver posto o resultado, e se alguém tiver outras dicas que possam ajudar por favor... valeu galera!!!
GOSTEI 0
Emerson Nascimento
21/07/2009
tente com este código:
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
Willer_sh
21/07/2009
Valeu Emerson funcionando perfeitamente... Muito obrigado mesmo!!!
GOSTEI 0