Retornar diferença de duas strings?
29/11/2009
0
String A
PORTA MALAS (S),
AIR BAG (4),
AR CONDICIONADO (S),
BANCO DE COURO (N),
DVD (N),
CADEIRINHA até 5 anos (S),
BAGAGEIRO teto (N)
String B
PORTA MALAS
AIR BAG
AR CONDICIONADO
BANCO DE COURO
Preciso que leiam as duas string, compare a diferença e retorne exatamente desta forma aqui
item_novo DVD (S),
item_novo CADEIRINHA até 5 anos (S),
item_novo BAGAGEIRO teto (N)
Tenho até uma função para verificar a diferença
function CompareStr(const cEntrada,cCompare:String):String;
var
lEntrada,lCompare,lSaida:TStrings;
i:Byte;
begin
lEntrada:=TStringList.create;
try
lCompare:=TStringList.create;
try
lSaida:=TStringList.create;
try
lEntrada.CommaText:= CapturarUpper(cEntrada);
lCompare.CommaText:= cCompare;
for I := 0 to lEntrada.Count - 1 do
begin
if lCompare.IndexOf(lEntrada.Strings[i]) < 0 then
//lEntrada.CommaText := cEntrada;
lSaida.Add('Item_Novo'+' '+lEntrada.Strings[i]);
end;
result:=lSaida.Text;
finally
lEntrada.Free;
end;
finally
lCompare.Free;
end;
finally
lSaida.Free;
end;
end;
e outra para capturar apenas as letras maiusculas para conseguir comparar entre as duas strings
function CapturarUpper(const AText: String): String;
var
i, vLength: Integer;
vChar: Char;
begin
Result := ' '; //aqui tem que ficar com este espaço para não ocorrer erro
vLength := Length(AText);
for i := 1 to vLength do
begin
vChar := AText[i];
if (vChar in ['a'..'z', 'A'..'Z']) and (vChar = UpCase(vChar)) then
begin
Result := Result + vChar;
end
else
begin
if (Result[Length(Result)] <> ' ') then //aqui eu defino se vai haver espaço ou não entre os campos ' '
Result := Result + ' '; //aqui eu defino se vai haver espaço ou não entre os campos
end;
end;
Result := Trim(Result);
end;[
Mais não me traz corretamente o retono da diferença entre as duas strings, e precisa ser igual a forma acima mostrada
Atenciosamente
Adriano.
Adriano Dolce
Posts
29/11/2009
Adriano Dolce
E preciso que retorne assim, e nesta posição abaixo sem quebra de linha antes da virgula
item_novo DVD (S),
item_novo CADEIRINHA até 5 anos (S),
item_novo BAGAGEIRO teto (N)
01/12/2009
Adriano Dolce
Usando BDS 2006
procedure TForm1.Button1Click(Sender: TObject);
var
xmc,xtz: String;
ListaXMC, ListaXTZ: TStringList;
i : integer;
begin
xmc := '[componente adicionais [ '+
' PORTA MALAS [S], '+
' AIR BAG [4], '+
' AR CONDICIONADO [S], '+
' BANCO DE COURO [N], '+
' DVD [N], '+
' CADEIRINHA até 5 anos [S], '+
' BAGAGEIRO teto [N] '+
' ]';
xtz := ' PORTA MALAS '+
' AIR BAG '+
' AR CONDICIONADO '+
' BANCO DE COURO ';
xmc := StringReplace(xmc,',','',[rfReplaceAll]);
xmc := StringReplace(xmc,' ',',',[rfReplaceAll]);
ListaXMC := TStringList.Create;
ListaXMC.Delimiter := ',';
ListaXMC.StrictDelimiter := true;
ListaXMC.CommaText := xmc;
xtz := StringReplace(xtz,' ',',',[rfReplaceAll]);
ListaXTZ := TStringList.Create;
ListaXTZ.Delimiter := ',';
ListaXTZ.StrictDelimiter := true;
ListaXTZ.CommaText := xtz;
for I := 1 to ListaXMC.Count - 1 do begin
try
if not AnsiContainsText(Trim(ListaXMC[i]),Trim(ListaXTZ[i-1])) then
Memo1.lines.Add('ITEM NOVO '+ListaXMC[i]+',');
except
Memo1.lines.Add('ITEM NOVO '+ListaXMC[i]+',');
end;
end;
ListaXMC.Free;
ListaXTZ.Free;
end;
Esta retornando assim:
ITEM NOVO DVD [N],
ITEM NOVO CADEIRINHA até 5 anos [S],
ITEM NOVO BAGAGEIRO teto [N],
ITEM NOVO ),
E esta parte em vermelho tenho que eliminar também:
uma virgula depois do (N) e o o destaque em vermelho abaixo.
ITEM NOVO BAGAGEIRO teto (N) ,
ITEM NOVO ),
01/12/2009
Adriano Dolce
for I := 1 to ListaXMC.Count - 2 do begin
try
if not AnsiContainsText(Trim(ListaXMC[i]),Trim(ListaXTZ[i-1])) then
Memo1.lines.Add('ITEM NOVO '+ListaXMC[i]+',');
except
if i = ListaXMC.Count - 2 then
Memo1.lines.Add('ITEM NOVO '+ListaXMC[i])
else
Memo1.lines.Add('ITEM NOVO '+ListaXMC[i]+',')
end;
end;
Clique aqui para fazer login e interagir na Comunidade :)