Opfer15 - Do 15.12.05 23:16
Titel: Textzeilen erfassen
Hallo,
hab da ein Problem hab eine ca 35 MB grosse Textdatei die ich gerne miteinander Vergleichen möchte doch ich habe bisher nur Methoden gefunden wo ich die Dateien vorher sortieren muss aber das Datei format muss gewart bleiben.
Sieht so aus
[Object xxx]
xxx=xxx
xxx=xxx
xxx=xxx
xxx=xxx
xxx=xxx
[Object xxx]
und ich möchte unterschiede in eine Datei speichern lassen
Moderiert von
raziel: Topic aus Windows API verschoben am Fr 16.12.2005 um 07:28
Horst_H - Fr 16.12.05 14:00
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