Array
(
)

Retornar diferença de duas strings?

Adriano Dolce
   - 29 nov 2009

Olá pessoal, preciso comparar duas strings e retornar o resultado em outra

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
   - 29 nov 2009

O reultado que esta vindo é este aqui



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)



Adriano Dolce
   - 01 dez 2009

*** 95% Resolvido ***

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 ),






Adriano Dolce
   - 01 dez 2009

*** RESOLVIDO ***

 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;