Abend zusammen,
zuerst mal vielen vielen Dank für die tollen Antworten. Ich versuche mal drauf zu reagieren:
1) FastMM - habe ich jetzt eine viertel Stunde gegoogelt und leider keine brauchbare Info bekommen, die mir erläutert, was ich damit konkret anfangen könnte. Hat jemand da zufällig einen geeigneten Thread im Kopf?
2) Bisschen Code. Ich bin ein fürchtlich schlechter Coder, daher verzicht ich am Anfang immer auf Code senden. Aber ich sehe ein, dass ich anders nicht voran käme.
Zuvor kurz die Info: Die Textdateien bestehen zuerst aus langen Listen, z.B. ("[tab]" = Tabulator):
Die [tab] ART [tab] D
Häuser [tab] NN [tab] Haus
usw.
Diese Liste wird in eine Stringlist1 geladen, dann String für String durchgegangen, in Abhängigkeit von bestimmten Infos entweder die erste, zweite oder dritte Stelle ermittelt und die dann in eine neue Stringlist2 kopiert. Sind alle Strings von Stringlist1 abgearbeitet, werden die einzelnen Strings aus Stringlist2 noch direkt aneinander gefügt (wieder zu einem Fließtext). Letzteres habe ich direkt versucht, aber leider nicht hinbekommen; das zieht aber auch kaum Zeit; die meiste Zeit geht drauf fürs Durchgehen von Stringlist1.
Hier ein Codeausschnitt aus einem Programmteil, der nicht mehrere Dateien, sondern nur einen Ausschnitt aus einer Datei verarbeitet ("Preview"-funktion); das Prinzip müsste daraus aber klar werden:
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);
schon:= 0;
if (lemmareal= '<UNKNOWN>') and (checkbox2.checked) then //weitere Bedingungen
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
schon:= 1;
end;
if (lemmareal= '@card@') and (checkbox4.checked) then
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
schon:= 1;
end;
if (lemmareal= 'CARD') and (checkbox4.checked) then
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
schon:= 1;
end;
if (lemmareal= '@ord@') and (checkbox4.checked) then
begin
ziel.text:= ziel.text + gibmirtoken(quelle.strings[ii], #9);
schon:= 1;
end;
if schon=0 then 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;
Der vorangegangene Code verweist auf folgende Routinen, die ich in Anlehnung an Funktionen ausm Netz verwende (hier hängt wohl die meiste Zeit..):
Delphi-Quellcode:
//Funktion für die Ersetzung; ist schneller als die alte stringreplace
function stringreplace2(aString, FromStr, ToStr: AnsiString): AnsiString;
var
I: Integer;
begin
// check whether string are equal
if FromStr = ToStr then
begin
Result := aString;
Exit;
end;
Result := '';
// find fromstr
I := Pos(FromStr, aString);
while I > 0 do
begin
// copy all characters prior fromstr
if I > 1 then
Result := Result + Copy(aString, 1, I - 1);
// append tostr
Result := Result + ToStr;
// delete all until after fromstr
Delete(aString, 1, I + Length(FromStr) - 1);
// find next fromstr
I := Pos(FromStr, aString);
end;
Result := Result + aString;
end;
//hier wird die zweite Stelle des durch tab geteilten Strings aus quelle ermittelt
function gibmirwortart(s:string; sep:char) :string;
var
t: Tstringlist;
begin
//hier muss jetzt das zweite Wort rausgefiltert werden
t:= tstringlist.create;
try
extractstrings([char(sep)], [' '], pchar(s), t);
result:= t.Strings[1];
finally
t.free;
end;
end;
//hier wird die erste Stelle des durch tab geteilten Strings aus quelle ermittelt
function gibmirToken(s:string; sep:char) :string;
var
t: Tstringlist;
begin
//hier muss jetzt das zweite Wort rausgefiltert werden
t:= tstringlist.create;
try
extractstrings([char(sep)], [' '], pchar(s), t);
result:= t.Strings[0];
finally
t.free;
end;
end;
//hier wird die dritte Stelle des durch tab geteilten Strings aus quelle ermittelt
function gibmirLemma(s:string; sep:char) :string;
var
t: Tstringlist;
begin
//hier muss jetzt das zweite Wort rausgefiltert werden
t:= tstringlist.create;
try
extractstrings([char(sep)], [' '], pchar(s), t);
result:= t.Strings[2];
finally
t.free;
end;
end;
3. Hashs u.ä. kann ich leider nicht umsetzen, dafür reicht mein Anfängerwissen nicht..
Vielleicht habt ihr auf meiner Codebasis eine Idee zum Zeitsparen?
Danke für Eure Mühe und viele Grüße zum Abend,
Friedemann