Einzelnen Beitrag anzeigen

GummiKuh68

Registriert seit: 10. Aug 2022
Ort: Berlin
4 Beiträge
 
Delphi 7 Enterprise
 
#1

Große Textdatei - einzelne Zeile löschen

  Alt 10. Aug 2022, 14:36
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!?
Angehängte Dateien
Dateityp: txt rockyou2022.txt (148 Bytes, 13x aufgerufen)
Oliver
Viele Grüße

GummiKuh68
  Mit Zitat antworten Zitat