Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.214 Beiträge
Delphi 12 Athens
|
Re: TStringlist mit 60000 Einträgen zu langsam
10. Feb 2010, 23:19
Delphi-Quellcode:
//hier wird die erste Stelle des durch tab geteilten Strings aus quelle ermittelt
function gibmirToken(s:string; sep:char) :string;
begin
Result := Copy(s, 1, Pos(#9, s) - 1);
end;
//hier wird die zweite Stelle des durch tab geteilten Strings aus quelle ermittelt
function gibmirwortart(s:string; sep:char) :string;
begin
Delete(Result, 1, Pos(#9, s));
Result := Copy(Result, 1, Pos(#9, s) - 1);
end;
//hier wird die dritte Stelle des durch tab geteilten Strings aus quelle ermittelt
function gibmirLemma(s:string; sep:char) :string;
begin
Delete(Result, 1, Pos(#9, s));
Delete(Result, 1, Pos(#9, s));
end;
Versuch es erstmal hiermit.
Mit Hilfe von PosEx ließe sich auch dieses noch weiter optimieren.
Statt diesem "schon" und dem Ausführen von Abfragen, welche eh nie zuschlagen werden, da vorher schon eine Abfrage erfolgreich war,
solltest du dich eventuell mal mit dem ELSE beschäftigen.
Delphi-Quellcode:
// Einzelne Texte zusammensetzen
begin
quelle:= tstringlist.create;
ziel:= tstringlist.create;
try
//Previewdatei laden
quelle.LoadFromFile(extractfilepath(application.exename) + 'preview2.dat');
//Ersetzen von zwei Zeichen, da sich ansonsten im weiteren Analyseverlauf nicht korrekt verarbeitet werden; umständlich, aber anders weiß ichs nich..
quelle.Text:=stringreplace2(quelle.text, '"', 'ANFUEEEE');
quelle.Text:=stringreplace2(quelle.text, #39, 'EINFANFUEEEE');
for ii:=0 to quelle.Count-1 do
begin
wortarttemp:= gibmirwortart(quelle.strings[ii], #9);
//Token zusammennehmen
if pos('#' + wortarttemp + '#', tok)<>0 then //Bedingung; braucht keine Zeit, da der zu durchsuchende String tok nur ~40 Zeichen groß ist
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
//Lemma zusammennehmen
if pos('#' + wortarttemp + '#', lem)<>0 then //s.o.
begin
lemmareal:= gibmirlemma(quelle.strings[ii], #9);
if (lemmareal= '<UNKNOWN>') and (checkbox2.checked) then //weitere Bedingungen
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
end
else
if (lemmareal= '@card@') and (checkbox4.checked) then
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
end
else
if (lemmareal= 'CARD') and (checkbox4.checked) then
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
end
else
if (lemmareal= '@ord@') and (checkbox4.checked) then
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
end;
else
ziel.text:= ziel.text + lemmareal;
end;
//Wortart zusammennehmen
if pos('#' + wortarttemp + '#', poss)<>0 then //s.o.
ziel.Text:= ziel.text + gibmirwortart(quelle.strings[ii], #9);
end;
//Wenn die Stringlist quelle durchgearbeitet ist und aller relevanten Strings in ziel, dann sollen die Strings in ziel zu einem fortlaufenden Text (-> zielende: string;) zusammengesetzt werden
for x:=0 to ziel.Count-1 do
zielende:= zielende + ' ' + ziel.Strings[x];
//Vorherige Ersetzungen rückgängig machen
zielende:= stringreplace2(zielende, 'ANFUEEEE', '"');
zielende:= stringreplace2(zielende, 'EINFANFUEEEE', #39);
//Ergebnis (Preview) in Memo ausgeben
memo2.text:= zielende;
finally
quelle.free;
ziel.Free;
end;
$2B or not $2B
|