Schalte mal bitte deine Bereichsprüfung ein, da knallt und ballert es ja nur so von Fehlermeldungen...
Hier mal eine Korrektur...
Delphi-Quellcode:
procedure ExtractWords(const AText: string;
AMinLength, AMaxLength: Integer;
AAllowedChars: SetOfChar;
AWords: TStrings);
var
i, iLength, TextLength: Integer;
sWord : string;
begin
AWords.BeginUpdate;
try
AWords.Clear;
i := 0;
TextLength := Length(AText);
while i < TextLength do
begin
Inc(i);
if AText[i] in AAllowedChars then
begin
sWord := '';
repeat
sWord := sWord + AText[i];
Inc(i);
until (i > TextLength)
or not (AText[i] in AAllowedChars);
iLength := Length(sWord);
if ((AMinLength = 0) or (iLength >= AMinLength))
and ((AMaxLength = 0) or (iLength <= AMaxLength)) then
begin
AWords.Append(sWord);
end;
end;
end;
finally
AWords.EndUpdate;
end;
end;
Ich habe gerade eine 100MB große Datei mit deiner Routine bearbeitet, das hat 7 Sekunden gedauert. Ist das wirklich zu langsam? Wie groß sind den deine Dateien?
Meine Testumgebung...
Delphi-Quellcode:
var Datei:file of char;
Data:string;
Start:TDateTime;
Words:TStringList;
begin
Words:=TStringList.Create;
try
try
assignfile(Datei, 'test.txt');
reset(Datei);
setlength(Data, filesize(Datei));
BlockRead(Datei, Data[1], filesize(Datei));
finally
closefile(Datei);
end;
Start:=Now;
ExtractWords(Data, 0, 0, ['<', 'd', 'i', 'v', '>'], Words);
ShowMessage(TimeToStr(Now - Start) + ' = Wörter: ' + inttostr(Words.Count));
finally
Words.free;
end;
end;