Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Unterschiede in Textdatei

  Alt 22. Mär 2014, 21:45
Mit so einem TextDiff wirst du nicht wirklich weiter kommen.

Zunächst musst du festlegen woran du erkennst, dass eine Zeile die gleiche Bedeutung hat wie eine andere Zeile (Identität). Daran kannst du dann feststellen, welche Zeilen fehlen (gelöscht) oder neu sind (hinzugefügt).

Erstelle dir eine Klasse, die den Inhalt einer Zeile aufnimmt und die Identitätsgleichheit prüfen kann
Delphi-Quellcode:
TDataItem = class
private
  FData : string;
  function GetIdentity : string;
public
  constructor Create( const Data : string );
  property Data : string read FData;
  function SameIdentityAs( Other : TDataItem ) : Boolean;
  function Equals( Obj : TObject ) : Boolean; {ab Delphi ?} override;
  function ToString : string; {ab Delphi ?} override;
end;

function TDataItem.Equals( Obj : TObject ) : Boolean;
begin
  if Self = Obj then Exit( true );
  if ( Obj = nil ) or ( Self.ClassType <> Obj.ClassType ) then Exit( False );
  Result := SameIdentityAs( Obj as TDataItem );
end;

function TDataItem.SameIdentityAs( Other : TDataItem );
begin
  Result := Assigned( Other ) and ( Self.GetIdentity = Other.GetIdentity );
end;

function TDataItem.GetIdentity : string;
begin
  Result := {Identitätsteil aus FData zurückgeben}
end;

function TDataItem.ToString : string;
begin
  Result := FDataStr;
end;
Jetzt erzeugst du dir eine Instanz von TObjectList und liest alle Zeilen aus der ersten Datei ein, machst aus jeder Zeile so ein TDataItem und ab in die Liste.

Eine weitere Instanz von einer TObjectList erzeugen und nun von der anderen Datei für jede Zeile eine TDataItem Instanz erstellen.

Diese Instanz prüft man nun gegen die Einträge der ersten Liste.
Findet man einen Identitätsgleichen Eintrag (mit der Equals Methode), dann den Eintrag aus der ersten Liste herausnehmen. Ein Vergleich mit der Data-Eigenschaft zeigt ob der Eintrag geändert wurde oder unverändert ist. Den aktuellen Wert an die zweite Liste hängen.
Findet man keinen Eintrag in der ersten Liste, dann ist der Eintrag neu und auch an die zweite Liste hängen.

Sind alle Zeilen der Datei bearbeitet, dann finden sich in der ersten Liste alle Einträge, die gelöscht wurden
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat