Ich denke, ich habe jetzt eine brauchbare Lösung gefunden. Nach der Stringbox Variante hatte ich es noch mit variablen Arrays versucht. Dies war dann schon deutlich schneller. Von ursprünglich über 3 Stunden für 120.000 Zeilen auf ca 20 Minuten auf einem E6600. Auf einem Celeron D war es dann mit gut einer Stunde immer noch unzumutbar. Habe es dann mit Stringlisten und einem kleinen Array probiert. Hierbei wird jeder gefundene Eintrag sofort gelöscht, damit wird die Routine immer schneller. Nun braucht die Prozedur nur noch 2.5 Minuten auf dem E6600. Und der Code wird auch immer kleiner
Das Sortieren würde bei 120.000 Zeilen ja auch etwas dauern und wenn ich jeden Wert in eine Zeile schreiben würde, hätte ich 600.000 Zeilen. Müßte ich vielleicht nochmal ausprobieren, was das noch bringt.
Hier mein Code:
Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var
rxl: string;
suchkoor: string;
Koor: Array[0..1000] of string[35];
i,l,k,j,maxi,cl: Integer;
maxrxl: Integer;
Liste1: Tstringlist;
Liste2: Tstringlist;
begin
Screen.Cursor:=crHourglass;
DecimalSeparator:='.';
liste1:=Tstringlist.Create;
liste1.LoadFromFile(OpenDialog1.FileName);
l:=liste1.Count;
progressbar1.Min:=-l;
progressbar1.Max:=0;
liste2:=Tstringlist.Create;
liste2.add('lon'+chr(9)+'lat'+chr(9)+'RXL'+chr(9)+'CID'+chr(9)+'BCCH');
repeat
suchkoor:=copy(Liste1[1],1,GetPosNumX(chr(9),Liste1[1],2)-1);
k:=0;
i:=1;
repeat
if (pos(suchkoor,liste1[i])>0) then
begin
koor[k]:=liste1[i];
k:=k+1;
liste1.Delete(i);
i:=i-1;
end;
i:=i+1;
cl:=Liste1.Count;
until i=cl;
maxrxl:=-200;
maxi:=0;
progressbar1.position:=-cl;
if k=1 then
begin
liste2.Add(koor[0]);
end
else if k>1 then
begin
for j := 0 to k - 1 do
begin
rxl:=copy(koor[j],GetPosNumX(chr(9),koor[j],2)+1,GetPosNumX(chr(9),koor[j],3)-GetPosNumX(chr(9),koor[j],2)-1);
if strtoint(rxl)>maxrxl then
begin
maxrxl:=strtoint(rxl);
maxi:=j;
end;
end;
liste2.Add(koor[maxi]);
end;
until liste1.Count=1;
liste2.SaveToFile(extractfilepath(OpenDialog1.FileName)+'Best.txt');
liste1.Destroy;
liste2.Destroy;
Screen.Cursor:=crDefault;
end;
Die Daten sind Messwerte von Handys.
Gruß
Carsten