Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
Delphi-Quellcode:
So, damit hast Du dann die Variante, die alle aufeinander folgenden, gleichen Zeilen löscht.
while not(eof(fd1)) do
begin readln(fd1,S); if (trim(S)<>'') and (S <> LAST) then begin writeln(fd2,S); Last := S; end; end; Möchtest Du allgemeiner jede Zeile nur einmal haben, dann versuche es lieber mit:
Delphi-Quellcode:
Wie Du hier siehst, wird der Hash nur für die neue Liste verwendet, die alte sollte möglichst keinen haben, da Du hier eh alle Zeilen betrachten wirst. Das Berechnen eines Hashs bringt dir also keinen Vorteil, kostet aber Zeit. Wird nun nach dem Index eines Strings gesucht, so kann dies mit einem Hash sehr viel schneller durchgeführt werden als ohne, für die neue Liste lohnt sich also dieser Hash. Alternativ gibt es noch mind. zwei Möglichkeiten, Du kannst die HashedStringList auch durch eine Map (Alzaimar hat mal eine für Strings als Schlüssel zur Verfügung gestellt) ersetzen (die ist vielleicht noch schneller). Oder aber du setzt bei der neuen StringList die Eigenschaft sorted auf True und die Eigenschaft Duplicates auf dupIgnore. Was davon die höchste Perfomance erzielt kann ich so nicht sagen, musst Du einfach mal testen.
var listAlt, listNeu: TStringList;
i: Integer; begin listAlt := TStringList.Create; // laden wie gehabt listAlt.LoadFromFile('...'); listNeu := THashedStringList.Create; for i := 0 to listAlt.Count - 1 do begin if listNeu.indexOf(listAlt[i]) < 0 then begin listNeu.add(listAlt[i]); end; end; listNeu.SaveToFile('...'); end; Gruß Der Unwissende |
Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
Wer will schon aus einen Logfile alle doppelten killen? Oder ist das so.. Frank |
Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
ggf. mal
Delphi-Quellcode:
Frank
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 (uppercase(S) <> LAST) then begin writeln(fd2,S); Last := uppercase(S); end; end; Closefile(fd2); Closefile(fd1); delete(fd1); rename(fd1,'C:\logfile.txt'); end; |
Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
Aber selbst im Log-File, wenn Du nur sehen möchtest, was für Probleme aufgetreten sind... Also es gibt bestimmt Dateien, wo man sich einfach mal die disjunkten Zerlegungen anschauen möchte. Aber mal die Frage andersrum, welches Logfile speichert denn mehrfach aufeinander folgend exact die gleiche Zeile? (schon wenn Datum und Uhrzeit im Log vorkommen hat man hier ja schnell zwei unterschiedliche Strings). |
Re: 80 MB Datei - doppelte Zeilen entfernen
Na ich würde sagen:
Delphi-Quellcode:
Sieht mir sehr nach einem Logfile aus...
if FileExists('logfile.txt') then
Frank |
Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
Ok, ich fang an und lerne Lesen! Ihr habt's ja so gewollt! |
Re: 80 MB Datei - doppelte Zeilen entfernen
Logfile.txt heisst die Datei nur weil ich den Code aus einem anderen Programm von mir übernommen habe.
Es sind Adressen um die es geht. gruss capo |
Re: 80 MB Datei - doppelte Zeilen entfernen
Delphi-Quellcode:
damit läuft es nun schon eine stunde, nichts passiert
var listAlt, listNeu: TStringList;
i: Integer; begin listAlt := TStringList.Create; // laden wie gehabt listAlt.LoadFromFile('...'); listNeu := THashedStringList.Create; for i := 0 to listAlt.Count - 1 do begin if listNeu.indexOf(listAlt[i]) < 0 then begin listNeu.add(listAlt[i]); end; end; listNeu.SaveToFile('...'); end; |
Re: 80 MB Datei - doppelte Zeilen entfernen
Moin Capo,
bist Du sicher, dass das Programm überhaupt schon mit dem Einlesen der Datei fertig ist? 80MB in eine Stringlist einzulesen kann ziemlich dauern. Wenn Du wirklich nur doppelte Zeilen finden willst, halte ich es für sinnvoller die Datei zeilenweise zu lesen (ReadLn usw.), jeweils einen MD5-Hash über der Zeile zu bilden, diesen in einer STringList suchen. Ist er nicht vorhanden, die Zeile in eine Zieldatei wegschreiben, und den Hashwert mit in die Tabelle aufnehmen. Die Eigenschaft Capacity (Anzahl zu erwartender Zeilen) einer StringList solltest Du bei solchen Aktionen auf einen möglichst korrekten Wert einstellen, um Geschwindigkeit herauszuholen. |
Re: 80 MB Datei - doppelte Zeilen entfernen
Moin Christian,
wäre es nicht schneller, die Strings direkt zu vergleichen, statt erst den "Umweg" per MD5 zu gehen ? Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr. |
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