Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
|
Re: 80 MB Datei - doppelte Zeilen entfernen
hallo und danke für eure antworten.
habs nun so gelöst: dauert damit ca. 10 minuten merkwürdigerweise werden dabei auch einige ; in der datei gelöscht. insofern ist diese lösung doch nicht so geeignet.
Delphi-Quellcode:
hallo Christian
procedure TForm1.Button1Click(Sender: TObject);
var SL: TStringList; I: integer; begin SL := TStringList.Create; try SL.BeginUpdate; try SL.LoadFromFile('C:\file.txt'); SL.Sort; for i := SL.Count - 2 downto 0 do if SL[i] = SL[i + 1] then SL.Delete(i + 1); SL.SaveToFile('C:\file_ok.txt'); finally SL.EndUpdate; end; finally SL.Free; end; Showmessage('Fertig...'); end; hast du evt. ein beispiel, ein paar zeilen? gruss capo |
Re: 80 MB Datei - doppelte Zeilen entfernen
Moin capo,
so würde ich das wohl bei einer solchen Dateigrösse machen:
Delphi-Quellcode:
für die MD5-Funktionen kannst Du dies nehmen.
var
fIN : TextFile; fOUT : TextFile; sl : TStringList; sLine : string; sMD5 : string; begin sl := TStringList.Create; try sl.Sorted := true; AssignFile(fIN,'<Pfad der Quelldatei>'); AssignFile(fOUT,'<Pfad der Zieldatei>'); Reset(fIN); Rewrite(fOUT); try Readln(fIn,sLine); while not Eof(fIN) do begin sMD5 := MD5Print(MD5String(sLine)); if sl.IndexOf(sMD5) = -1 then begin sl.Add(sMD5); Writeln(fOUT); end; Readln(fIN,sLine); end; finally CloseFile(fOUT); CloseFile(fIN); end; finally FreeAndNil(sl); end; end; Sicher kostest es Zeit die MD5 zu berechnen, um einen doppelten String zu ermitteln, aber bei der Datenmenge könnte es schneller sein. Eine andere Variante:
Delphi-Quellcode:
var
fIN : TextFile; slOut : TStringList; sLine : string; begin slOut := TStringList.Create; try slOut.Capacity := 1000000; slOut.Sorted := True; slOut.CaseSensitive := False; slOut.Duplicates := dupIgnore; AssignFile(fIN,'<Pfad der Quelldatei>'); Reset(fIN); try Readln(fIn,sLine); while not Eof(fIN) do begin slOut.Add(sLine); Readln(fIN,sLine); end; finally CloseFile(fIN); end; slOut.SaveToFile('<Pfad der Zieldatei>'); finally FreeAndNil(slOut); end; end; |
Re: 80 MB Datei - doppelte Zeilen entfernen
hallo christian
dankeschön für deine beispiele. :-D |
Re: 80 MB Datei - doppelte Zeilen entfernen
Moin Christian,
du ignorierst in beiden Varianten die letzte Zeile der Eingabedatei. Das Ergebnis der ersten Variante ist sicher auch nicht das gewünschte. Korrektur der Variante 1:
Delphi-Quellcode:
Korrektur der Variante 2:
[...]
try // Readln(fIn,sLine); // entfernt while not Eof(fIN) do begin Readln(fIn,sLine); // neu sMD5 := MD5Print(MD5String(sLine)); if sl.IndexOf(sMD5) = -1 then begin sl.Add(sMD5); Writeln(fOUT, sLine); // korrigiert end; // Readln(fIN,sLine); // entfernt end; finally [...]
Delphi-Quellcode:
Gruß Hawkeye
[...]
try // Readln(fIn,sLine); // entfernt while not Eof(fIN) do begin Readln(fIn,sLine); // neu slOut.Add(sLine); // Readln(fIN,sLine); // entfernt end; finally [...] |
Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
Du läßt uns hier rumrätzeln, weil Du Deine Frage so schwammig gestellt hast... Na was den nu? Sind die doppelten jetzt über die Datei verteilt oder liegen die hintereinander? Wenn es 80MB sind und es sich dabei um Adressen handelt sind das bei typischer Adressgröße ca. 500.000-700.000 Adressen...(Zeilen), richtig? Dann vielleicht sowas...
Delphi-Quellcode:
Frank :coder:
type
TSorter = Record CRC : longint; Zeile : longint; end; var Sort : array of TSorter; Count : integer; S : String; i : integer; begin assignfile(fd1,'Adressen.txt'); reset(fd1); Count := 0; Setlength(Sort,500000); while not(eof(fd1)) do begin readln(fd1,S); if length(Sort) > Count+1 then begin Sort.CRC := CRC4(S); // Oder auch den HD5 Sort.Zeile := Count; end else begin Setlength(Sort,Count + 10000); // Je größer die Zahl, desto schneller... end; inc(Count) end; Closefile(fd1); QSort(Sort,0,Count); // Gibt es von mir hier eine Kombo... // Den rest überlasse ich Dir... // Doppelte aus dem Array löschen... // Dann nur die Zeilen in die andere Dateikopieren, wenn Count in sort.Zeile end; PS.: Und wenn es dann noch nicht schnell genug ist... Zip die Adress-Datei zusammen und leg sie irgendwo hin... Denn das Antworten hier dauert jetzt schon länger als eine Konvertierung.. :-) |
Re: 80 MB Datei - doppelte Zeilen entfernen
Ich weiß jetzt nicht, was Franks QSort so macht, aber wenn die Reihenfolge der Elemente in der Liste geändert werden darf, würde ich auf jeden Fall Shellsort vorschlagen. Das sollte bei der Datenmenge das schnellste Verfahren sein.
Baue doch einfach mal ein paar Cardinals ein und ermittle den TickCount. Dann weißt du, an welcher Stelle du am Besten optimieren solltest. Edit: Noch was. Was machst du denn mit den Adressen? Falls du vorhast, sie anschließend in eine DB einzulesen, dann spar dir doch das Bearbeiten der Datei und mach die Logik lieber mit der DB. |
Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
Zitat:
Frank :coder: |
Re: 80 MB Datei - doppelte Zeilen entfernen
Hallo und auch gleich ein SORRY.
Ja es sind Adressen. Ich dachte es ist egal was in den Zeilen steht wenn ich sage das diese doppelt oder mehrfach vorkommen. Wieder etwas gelernt. Danke an ALLE Gruss Capo |
Re: 80 MB Datei - doppelte Zeilen entfernen
Zitat:
Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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