Hallo!
Ich habe eine kleine Konsolenanwendung geschrieben, welche eine große Datei durchsuchen und bestimmte Zeichenfolgen ersetzen soll.
Erstmal soll die
ASCII-Folge 139210 durch
ASCII 32 ersetzt werden.
Danach sollen alle übriggebliebenen
ASCII 13 durch
ASCII 32 ersetzt werden.
Danach sollen alle übriggebliebenen
ASCII 10 durch
ASCII 1310 ersetzt werden.
Das Programm braucht leider für eine 16MB Datei schon ca. 5 Minuten.
Es soll aber für Dateien mit über 500MB (eventuell auch über 1GB) eingesetzt werden.
Kann mir jemand ein paar Tipps geben, wo ich was verbessern kann bzw. wo mein Programm ausgebremst wird?
Hier der komplette Quelltext:
Delphi-Quellcode:
program ersetze;
{$APPTYPE CONSOLE}
uses
SysUtils,Classes;
var stream1: TFIleStream;
stream2: TFileStream;
Buf,Buf2,Buf3 : Byte;
chSpace,chCR,chLF: char;
a,b,c:integer;
begin
a:=0;
b:=0;
c:=0;
chSpace := #32;
chCR := #13;
chLF := #10;
stream1 := TFileStream.Create('
c:\test.unl', fmOpenRead);
stream2 := TFileStream.Create('
c:\test2.unl', fmCreate);
try
// Byteweise in Stream1 bis zum Dateiende lesen
while stream1.Position < stream1.size
do
begin
stream1.
Read(Buf,sizeof(Buf));
if Buf = 13
then // ASCII 13 gefunden -> nächstes Byte muss überprüft werden
begin
stream1.
Read(Buf2,sizeof(Buf2));
if Buf2 = 92
then // ASCII 1392 gefunden -> nächstes Byte muss überprüft werden
begin
stream1.
Read(Buf3,sizeof(Buf3));
if Buf3 = 10
then // ASCII 139210 gefunden
begin // Statt ASCII 139210 wird ASCII 32 (Space) in die neue Datei geschrieben
stream2.
Write(chSpace,sizeof(chSpace));
a := a + 1;
end
else // kein ASCII 10 an dritter Stelle -> ASCII 32 (Space) in neue Datei schreiben und 2 Bytes zurückspringen
begin
stream2.
Write(chSpace,SizeOf(chSpace));
stream1.Seek(-2,soFromCurrent);
b := b + 1;
end;
end
else // kein ASCII 92 an zweiter Stelle -> ASCII 32 (Space) in neue Datei schreiben und 1 Byte zurückspringen
begin
stream2.
Write(chSpace,SizeOf(chSpace));
stream1.Seek(-1,soFromCurrent);
b := b + 1;
end;
end
else if Buf = 10
then // Kein ASCII 13 gefunden -> Prüfen ob ASCII 10 gefunden wurde
begin // ASCII 10 gefunden -> ASCII 1310 in neue Datei schreiben
stream2.
Write(chCR,SizeOf(chCR));
stream2.
Write(chLF,SizeOf(chLF));
c:=c+1;
end
else
begin // Kein ASCII 10 gefunden -> Buf in Datei schreiben
stream2.
Write(Buf,SizeOf(Buf));
end;
end;
finally
stream1.Free;
stream2.Free;
end;
writeln('
gefundene 0D5C0A: ' + IntToStr(a));
writeln('
gefundene 0D: ' + IntToStr(b));
writeln('
gefundene 0A: ' + IntToStr(c));
Readln;
end.
MfG
slang