Hallo zusammen,
ich habe folgende Problemstellung:
Grundlage:
Eine große Textdatei (bis zu 100-200MB) liegt mit Leerzeilen vor. Dazwischen gibt es an einigen Stellen #26 (EOF). Dies ist leider wirklich so.
Wenn ich nun die Zeilen über Readln(f,s) einlese, so bricht der Vorgang leider beim ersten #26 ab.
Beim Erzeugen kann ich die Textdatei leider nicht modifizieren.
Zielsetzung:
Ersetzen aller #26 durch #32 und gleichzeitig alle Leerzeilen eliminieren.
Lösungsansatz:
Ersetzen der Readln-Routine:
<PRE>
function Save_Readln2(var f:fileofchar; var s:string) : boolean;
var c:char;
lf:boolean;
begin
c:=#0;
lf:=false;
while not eof(f) and (c<>#10) and (c<>#13) do begin
read(f,c);
if (c=#26) then
c:=#32;
if (c<>#10) and (c<>#13) then begin
lf:=true;
s:=s+c
end
end;
Result:=lf;
end;
</PRE>
Dies funktioniert zwar so wie gewünscht, aber es dauert bei einer ca. 33MB großen Datei mit ca. 650000 Zeilen leider ca. 4 min. auf einem 1GHz-Athlon-System mit 768MB RAM.
Gibt es eine andere und schnellere Lösung?
Gruß
Michael
ich habe folgende Problemstellung:
Grundlage:
Eine große Textdatei (bis zu 100-200MB) liegt mit Leerzeilen vor. Dazwischen gibt es an einigen Stellen #26 (EOF). Dies ist leider wirklich so.
Wenn ich nun die Zeilen über Readln(f,s) einlese, so bricht der Vorgang leider beim ersten #26 ab.
Beim Erzeugen kann ich die Textdatei leider nicht modifizieren.
Zielsetzung:
Ersetzen aller #26 durch #32 und gleichzeitig alle Leerzeilen eliminieren.
Lösungsansatz:
Ersetzen der Readln-Routine:
<PRE>
function Save_Readln2(var f:fileofchar; var s:string) : boolean;
var c:char;
lf:boolean;
begin
c:=#0;
lf:=false;
while not eof(f) and (c<>#10) and (c<>#13) do begin
read(f,c);
if (c=#26) then
c:=#32;
if (c<>#10) and (c<>#13) then begin
lf:=true;
s:=s+c
end
end;
Result:=lf;
end;
</PRE>
Dies funktioniert zwar so wie gewünscht, aber es dauert bei einer ca. 33MB großen Datei mit ca. 650000 Zeilen leider ca. 4 min. auf einem 1GHz-Athlon-System mit 768MB RAM.
Gibt es eine andere und schnellere Lösung?
Gruß
Michael
Comment