Autor Beitrag
Opfer15
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Windows Xp, Vista, 2k, Suse Linux 9
C#, Delphi
BeitragVerfasst: Do 15.12.05 23:16 
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 user profile iconraziel: Topic aus Windows API verschoben am Fr 16.12.2005 um 07:28
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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:
ausblenden 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;   
  // In sl.Objects[i] ist ein Zeiger auf das entsprechend TMyRecord

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.
ausblenden 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