Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Doppelte Einträge in Textdatei löschen (https://www.delphipraxis.net/33592-doppelte-eintraege-textdatei-loeschen.html)

Pseudemys Nelsoni 9. Nov 2004 16:19


Doppelte Einträge in Textdatei löschen
 
OK, wie man es macht weiss ich, nur ist das nicht die eleganteste lösung...ich habe das bisher immer so gemacht, das ich für jede einzelne zeile die komplette datei durchgegangen bin um nach doppelten einträgen zu schauen und sie ggf. zu löschen... nur wären das bei 10.000 einträgen schon bis zu 10.000*10.000= 100.000.000 millionen prüfungen.... gibt es eine schnellere alternative?

fkerber 9. Nov 2004 16:28

Re: Doppelte Einträge in Textdatei löschen
 
Hi!

Lade alle Zeilen in eine Stringlist, sortiere sie und überprüfe nur noch, ob 2 aufeinanderfolgende Einträge gleich sind


Ciao Frederic

czapie 9. Nov 2004 16:54

Re: Doppelte Einträge in Textdatei löschen
 
Hallo,

Frederic ich bin mir nicht sicher, ob das wirklich schneller ist.
Aber du könntest:
Bei der 1. Zeile anfangen und gucken ob gleiche vorhanden bis Zeile n.
Dann von 2. Zeile bis n.
usw.

Das entspricht einem Maximalaufwand (also n unterschiedliche Zeilen) von
0,5n * (n+1) = 0,5n^2 + 0,5n

Und das ist zwar von der Komplexität immer noch quaratisch, aber nicht mehr
ganz n^2 wie du erläutert hast.

Um auf Frederic nochmal einzugehen:
Es wäre möglich einen Sortieralgorithmus, der z.B. eine logarithmische Komplexität hat, derartig zu modifizieren, das beim Vergleich zweier Zeilen während des Sortierens, bei gleichen Zeilen schon gelöscht wird?!

Czapie.

rookied5 9. Nov 2004 17:00

Re: Doppelte Einträge in Textdatei löschen
 
Die Textdatei zeilenweise in eine (unsortierte) Listbox übernehmen und vor dem Übernehmen (add) überprüfen, ob die Zeile schon drin ist (irgendwas mit ItemIndex = -1 war das, glaube ich).

Danach den Inhalt der Listbox wieder zeilenweise in die Textdatei (rewrite) zurückschreiben, falls die Doubletten rausfliegen sollen.

Das sollte etwas schneller gehen.
Bei der Listbox kannst Du visible auf false setzen.

mfg

czapie 9. Nov 2004 17:11

Re: Doppelte Einträge in Textdatei löschen
 
Wie kann man prüfen, ob ein Eintrag schon vorhanden ist?

Nächste Frage wäre, wie schnell diese Überprüfung läuft,
denn das ist ja eigentlich nur eine Verlagerung des
Problems, der Aufwand bleibt ja!

alcaeus 9. Nov 2004 17:15

Re: Doppelte Einträge in Textdatei löschen
 
Hi allerseits,

nach kurzer Überlegung ist eines klar: die Methode von rookied5 ist sicher langsam. IndexOf läuft ja auch nur alle Elemente in einer Schleife durch. IMHO ist es da wirklich einfacher, die textdatei in eine StringList zu laden (mit DelimitedText), zu sortieren und dann einmal über die Liste drüberzufahren und doppelte Elemente rauszuwerfen.

Greetz
alcaeus

nailor 9. Nov 2004 17:18

Re: Doppelte Einträge in Textdatei löschen
 
das ganze nich in ner ListBox machen, sondern in einer StringList (oder beliebigen nichtvisuellen Komponente). Das sollte die Sache schon seeeehr stark beschleunigen. Wahrscheinlich so stark, dass alle anderen Optimierungen überflüssig werden.

czapie 9. Nov 2004 17:24

Re: Doppelte Einträge in Textdatei löschen
 
Hallo,

ich glaube, das dieses Problem ungelöst von Komponenten und Datenstrukturen betrachtet werden kann.
Es ist reine Algorithmik.
@alcaeus:
Aber auch das Sortieren, hat einen Aufwand, und wenn dieser plus, das hin und her schreiben dem Überprüfen in der Datei gleichkommt macht es keinen Sinn.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 Uhr.

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