Hallo,
beide Dateien in Stringlisten lesen.
Zwei neu Stringlisten erstellen und nur die relevanten Zeile und Index abspeichern und sortieren.
von alzaimar:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Var sl : TStringList;
Begin sl := TStringlist.creatE; sl.capacity := Length (A); For i:=0 To High (A) Do sl.addObject (a[i].Caption, @A[i]); sl.sort; |
sl.addObject (a[i].Caption, @A[i]);
ersetzt Du durch
sl.addObject (slObj[OffsetObjekte*i+deltaOff], Pointer(i));
slObj ist die Stringliste fuer eine komplette Textdatei.
OffsetObjekte = Abstand zwischen den ersten Zeilen zweier Objekte (Ich hoffe, dieser ist konstant, sonst muss man eben die Liste entlanglaufen und suchen)
delta = Ist der statische Offset von Zeile 0 bis zur gewuenschten Zeile des ersten( relevanten) Objektes.
In deinem Beispiel die letzte Zeile des Objektes.
OffsetObjekte = 7 (Zeilen) und delta = 5
Wenn jetzt beide Listen sortiert sind, kann man leicht die einzigartigen filtern.
Das ist wie merge sort.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| i,j = 0; wiederhole falls sl_1[i] < sl_2[j] dann wegschreiben des Objektes aus strLObj_1 {strObj_1.[integer(Objects)] ist die Delta.te Zeile} Wechselsuchen sl_1 {repeat inc(i) until (sl_1[i]<>s1_l[i+1]) or (i>sl_1.Count-1)} Falls i am ende raus hier falls sl_1[i] > sl_2[j] dann wegschreiben des Objektes aus strLObj_2 Wechselsuchen sl_2 Falls j am ende raus hier sonst Wechselsuchen sl_1 Wechselsuchen sl_2; end bis i oder j jeweils am ende ihrer liste Falls j nicht am ende restdaten sl_2 wegschreiben Falls i nicht am ende restdaten sl_1 wegschreiben |
Gruss Horst