Einzelnen Beitrag anzeigen

Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#15

Re: aus 480 MB txt Datei, bestimmte Zeilen löschen lassen...

  Alt 5. Feb 2004, 13:36
Hallo!

3 Varianten sind möglich:
1. die zu löschenden Zeilen haben alle denselben Inhalt. Dann sieht das Ganze so aus:

Delphi-Quellcode:
const loeschen = ' .00 .00 -300.00 0';

var tin, tout:Textfile;
    lese:String;
begin
  AssignFile(tin, 'c:\kai.txt'); // Name der Datei ist kai, lasse sie damit Laden
  AssignFile(tout, 'c:\kaineu.txt'); // gebe hier Name und Pfad an, wo das Resultat dann hin soll
  Reset(tin);
  Rewrite(tout);
  while not Eof(tin) do
  begin
    ReadLn(tin, lese);
    if lese <> loeschen then // Vergleich der kompletten Zeile
      writeln(tout,lese);
  end;
  CloseFile(tout);
  CloseFile(tin);
end;
Deine Beispieldaten sind ja so aufgebaut.

2. die zu löschenden Zeilen haben unterschiedlichen Inhalt, aber die Spalten sind fest definiert. Dann sieht das Ganze so aus:

Delphi-Quellcode:
const loeschen = '-300.00';
      loeschpos=32; // ggf. auszählen!
      
var tin, tout:Textfile;
    lese:String;
begin
  AssignFile(tin, 'c:\kai.txt'); // Name der Datei ist kai, lasse sie damit Laden
  AssignFile(tout, 'c:\kaineu.txt'); // gebe hier Name und Pfad an, wo das Resultat dann hin soll
  Reset(tin);
  Rewrite(tout);
  while not Eof(tin) do
  begin
    ReadLn(tin, lese);
    if Copy(lese,loeschpos,Length(loeschen)) <> loeschen then // Vergleich der betreffenden Spalten
      writeln(tout,lese);
  end;
  CloseFile(tout);
  CloseFile(tin);
end;

3. die zu löschenden Zeilen enthalten das "-300.00" an unterschiedlichen Stellen, aber dieser Wert kommt in den übrigen Zeilen garantiert nicht vor. Dann sieht das Ganze so aus:

Delphi-Quellcode:
const loeschen = '-300.00';
      
var tin, tout:Textfile;
    lese:String;
begin
  AssignFile(tin, 'c:\kai.txt'); // Name der Datei ist kai, lasse sie damit Laden
  AssignFile(tout, 'c:\kaineu.txt'); // gebe hier Name und Pfad an, wo das Resultat dann hin soll
  Reset(tin);
  Rewrite(tout);
  while not Eof(tin) do
  begin
    ReadLn(tin, lese);
    if Pos(loeschen,lese) <> 0 then // KO-Zeichenfolge suchen
      writeln(tout,lese);
  end;
  CloseFile(tout);
  CloseFile(tin);
end;
Sollte keines der Kritereien erfüllt sein, mußt Du eben die Zeile zerlegen und dann den passenden Abschnitt (hier 3. Bereich) vergleichen.


Allerdings gebe ich eines zu bedenken: Auch wenn es sehr ressourcenfressend ist, nach Windows-Norm muss die komplette Datei in den Speicher. Wozu gibt es das Pagefile - auch wenn das das System ausbremst Ich bevorzuge allerdings auch die klassische Methode mit zeilenweiser Verarbeitung.

Gruß

Dietmar Brüggendiek
Dietmar Brüggendiek
  Mit Zitat antworten Zitat