Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 80 MB Datei - doppelte Zeilen entfernen (https://www.delphipraxis.net/84459-80-mb-datei-doppelte-zeilen-entfernen.html)

capo 17. Jan 2007 09:29


80 MB Datei - doppelte Zeilen entfernen
 
Hallo,
ich muss bei einer 80 MB großen Datei alle doppelten un leeren Zeilen entfernen
So dauert das eine Ewigkeit:
Delphi-Quellcode:
if FileExists('logfile.txt') then
begin
  FWords := THashedStringList.Create;
  application.ProcessMessages;
  FWords.LoadFromFile(
    ExtractFilePath(Application.ExeName) + 'logfile.txt');
  lv.Items.Count := FWords.Count;
  DeleteDuplicates(Fwords);
gruss vom capo

mkinzler 17. Jan 2007 09:33

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Wie sieht das Format einer Zeile aus?

Bernhard Geyer 17. Jan 2007 09:37

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Besorg dir AQTime und such die Hotspots der verbratenen Zeit

Union 17. Jan 2007 09:45

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Hallo, einen Ansatz dazu findest Du hier

Mavarik 17. Jan 2007 10:04

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Zitat:

Zitat von capo
So dauert das eine Ewigkeit:

Das kann ich mir vorstellen...

Hast Du 160MB Platz?

Dann so:
Delphi-Quellcode:
var
  fd1,fd2 : Textfile;
  S,Last : string;
begin
  assignfile(fd1,'logfile.txt');
  assignfile(fd2,'logfile.neu');
  reset(fd1);
  rewrite(fd2);
  Last := '';
  while not(eof(fd1)) do
    begin
      readln(fd1,S);
      if (trim(S)<>'') and (S <> LAST) then
        writeln(fd2,S);
      Last := S;
    end;

  Closefile(fd2);
  Closefile(fd1);
  deletefile(fd1);
  rename(fd2,'logfile.txt');
end;
Untested...QuickandDirty.. NoErrorcheck

Schreibmal wieviel schneller es war!

Frank :coder:

Der_Unwissende 17. Jan 2007 10:31

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Hi,
wie arbeitet denn die Methode DeleteDuplicates?
Und wie meinst Du denn doppelte Zeilen? Möchtest Du hier Zeilen die zweimal hintereinander stehen entfernen? Oder möchstest Du die Datei in disjunkte Zeilen zerlegen (also eine Zeile wird nur einmal in die Liste übernommen, egal wie oft und wo sie in der Datei vorkommt)?

Gruß Der Unwissende

capo 17. Jan 2007 11:53

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Hallo
danke für eure Antworten.
Die zeilen können auch 2 - x mal vorkommen, habe meine Frage falsch formulieren.
Das hier scheint dann dafür nicht das richtige zu sein, oder.
Delphi-Quellcode:
var
  fd1,fd2 : Textfile;
  S,Last : string;
begin
  assignfile(fd1,'logfile.txt');
  assignfile(fd2,'logfile.neu');
  reset(fd1);
  rewrite(fd2);
  Last := '';
  while not(eof(fd1)) do
    begin
      readln(fd1,S);
      if (trim(S)<>'') and (S <> LAST) then
        writeln(fd2,S);
      Last := S;
    end;

  Closefile(fd2);
  Closefile(fd1);
  deletefile(fd1);
  rename(fd2,'logfile.txt');
end;
hier habe ich dann auch noch einen fehler:
Zitat:

[Fehler] Unit1.pas(47): Inkompatible Typen: 'String' und 'Text'
Delphi-Quellcode:
deletefile(fd1);

mkinzler 17. Jan 2007 12:01

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Zitat:

Delphi-Quellcode:
deletefile(fd1);

DeleteFile möchte den Dateinamen:
Delphi-Quellcode:
deletefile('logfile.txt');

Mavarik 17. Jan 2007 12:01

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Sorry doch, dass ist genau das richtige...

Muss nur
Delphi-Quellcode:
delete(fd1);
heißen..

Frank :coder:

capo 17. Jan 2007 12:34

Re: 80 MB Datei - doppelte Zeilen entfernen
 
Hallo
so mach ich das nun aber es sind immer noch doppelte Einträge vorhanden.
Also dachte ich mir lass ich das ganze nocheinmal mit der neuen Datei durchlaufen, klappt aber dennoch nicht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fd1,fd2 : Textfile;
  S,Last : string;
begin
  assignfile(fd1,'C:\logfile.txt');
  assignfile(fd2,'C:\logfile.neu');
  reset(fd1);
  rewrite(fd2);
  Last := '';
  while not(eof(fd1)) do
    begin
      readln(fd1,S);
      if (trim(S)<>'') and (S <> LAST) then
        writeln(fd2,S);
      Last := S;
    end;

  Closefile(fd2);
  Closefile(fd1);
  deletefile('logfile.txt');
rename(fd1,'C:\logfile.txt');
end;
gruss capo


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz