Moin, moin,
...'...oh Nein, nicht schon wieder Textdatei...' möge manch einer jetzt denken...hatten wir schon!
Ja und habe ich auch alles gelesen - passt aber alles nicht!
Problem:
Ich habe eine Datei die ca. 97 GB groß ist (Klartext: rockyou2021.txt!).
Eins vorneweg - das Problem mit ähnlich großen Dateien habe ich auch während des Supports, wenn ich Messdaten im Rahmen der Fehlersuche analysieren muss.
Nun ist es ja so, dass man Dateien ab einer gewissen Größe nicht mal ebenso in einen Editor laden kann.
Notepad++, PilotEdit, PSPad, usw. machen da irgendwann schlapp! UltraEdit soll das angeblich können, aber da der Download der Demo nicht klappt, kann ich dazu wenig sagen!
Meine Idee war nun, Zeile für Zeile aus der Datei zu lesen und gleich in eine andere Datei zu schreiben, deren Dateiname sich vom Original unterscheidet (Zusatz im Dateinamen:
ASCII-Wert des ersten Zeichens!).
Das habe ich auch schon hinbekommen, dass läuft sauber durch.
Das Dumme daran ist, das ich dafür den Rechner die nächste Tage durchlaufen lassen muss - wenn ich das mache, habe ich gleich GAAAAANNZZ andere Probleme!
Aktuell benutze ich folgenden Code:
Delphi-Quellcode:
procedure TForm1.cb3Click(Sender: TObject);
var
InFile : TextFile;
i,cnt,s : integer;
Rest,a: string;
b :Char;
begin
assignFile (Infile, 'I:\rockyou2021.txt');
reset (Infile);
while not eof (InFile) do
begin
readln (InFile, Rest);
if Rest <> '' then
begin
b:=Rest[1];
of_insstr('I:\rockyou2021-'+inttostr(ord(b))+'.txt',Rest);
end;
end;
CloseFile (InFile);
end;
procedure TForm1.of_insstr(OFile,fstr:string);
var
OutFile :TextFile;
i,cnt,s : integer;
Rest,a,b: string;
begin
//
if FileExists(OFile) then
begin
assignFile (OutFile, OFile);
append(OutFile);
end
else
begin
assignFile (OutFile, OFile);
rewrite(OutFile);
end;
Writeln(OutFile,fstr);
CloseFile (OutFile);
end;
Ich hab das jetzt auch schon mal laufen lassen und war auch mit dem Ergebnis bisher zufrieden. Allerdings werde ich das wegen der Dauer (habe nach 4 Stunden abgebrochen), immer wieder neu starten müssen.
Das bedeutet aber, das das Programm die Datei von Anfang an ließt und wenn ich die erzeugten Dateien nicht wegschmeiße, alles doppelt reinschreibt, was Mist ist!
Daher war meine Idee, dass ich die Zeile, die ich gerade in eine andere Datei geschrieben habe aus der Ursprungsdatei lösche.
Wenn ich den Code in cb3Click jetzt wie folgt anpasse:
Delphi-Quellcode:
assignFile (Infile, 'I:\rockyou2022.txt');
reset (Infile);
while not eof (InFile) do
begin
readln (InFile, Rest);
if Rest <> '' then
begin
b:=Rest[1];
of_insstr('I:\rockyou2021-'+inttostr(ord(b))+'.txt',Rest);
writeln(InFile, ''); // '' wäre ok, obwohl noch #13#10 bleibt! Ganz raus wäre noch besser!
end;
end;
CloseFile (InFile);
...bekomme ich zurecht einen Fehler, da die Textdatei mit Reset() nur für das Lesen geöffnet wird.
Was übersehe ich hier?
Ich hatte schon über TStringList nachgedacht aber wenn ich die ca. 97 GB da reinlade...??
TFileStream hatte ich auch schonmal als Idee im Hinterkopf, aber keinen Plan, da ich mit FileStreams bisher eher weniger zu tun hatte.
Zum Testen habe ich mir natürlich eine kleinere Datei gebastelt (s. Anhang).
Vielleicht hat da ja jemand von euch eine Idee!?