Seite 1 von 1

Aus csv Datei doppelte Einträge entfernen

Verfasst: Sonntag 27. Februar 2005, 12:40
von LittleDeamon
Wie schon der Titel sagt, ich brauch hilfe dabei aus einer csv Liste doppelte Einträge zu entfernen.

Die csv Datei hat mehere Zeilen und Reihen, ist Zeitlich sortiert!.

Wenn ein doppelter Eintrag existiert sollte auch wirklich der Reihenfolge höchste Eintrag entfernt werden!.

so sieht ein Schema eines Eintrags aus

Code: Alles auswählen

"NameB;"NameC"; "Typ"; "Datum"
zu beachten wäre das die Datei schnell recht groß sein wird.

mfg LittleD

Verfasst: Sonntag 27. Februar 2005, 13:34
von fs111
Meinst Du sowas?

Schnellschuss:

Code: Alles auswählen

from sets import Set
f = open("mein.csv")
set = Set([line.strip() for line in f])

f.close()

out = open("output.csv", "w")
for entry in set:
    out.write("%s\n"%(entry))

out.close()

fs111

Verfasst: Sonntag 27. Februar 2005, 14:13
von Gast
ja macht schon in etwa was es soll?

Aber ein paar Einträge wieso auch immer sind immernoch doppelt, und die Sortierung ist auch dahin.

Code: Alles auswählen

set = Set([line.strip() for line in f]) 
Ich glaube das ist die wichtig Zeile->

Gehe jede Zeile durch, kommt diese schon an ANDERER Stelle vor -> lösche diese.

wenn die for Anweisung gerichtet ist Dateianfang -> Dateiende wäre mir eine Code lieber der

Gehe jeder Zeile durch, lösche alle andere Mehrfach Vorkommen dieser Zeile im kommenden Rest der Datei?

Nur steh ich mit diesen hübschen Einzelern noch auf Kriegsfuss, das überlass ich zur Zeit noch den Profis.

mfg LittleD

Verfasst: Sonntag 27. Februar 2005, 14:23
von fs111
Dass immer noch doppelte drin sind, liegt mit Sicherheit daran, dass die sich in Leerzeichen o.ä. unterscheiden, ansonsten wäre die Set-Impementierung von Python kaputt.

Wenn wir Deinen Ansatz wäheln würden, dann würde die Laufzeit des Programms aber exponentiell wachsen, wenn Du mit jeder Zeile wieder alle anderen vergleichen würdest. Aus diesem Grund sollte man eine möglichst intelligente Datenstruktur nutzen, um das in einem Rutsch zu erledigen. Ein anderer Ansatz wäre die Verwendung eines dictionaries, das zerstört aber auch die Sortierung, d.h. Du müsstest noch mitprotokollieren, was wo hingehört.

fs111

Verfasst: Sonntag 27. Februar 2005, 23:58
von BlackJack
Wie wär's damit beide Ansätze zu kombinieren, also `set` und jede Zeile vergleichen (ungetestet):

Code: Alles auswählen

from sets import Set

infile = open('input.csv', 'r')
outfile = open('output.csv', 'w')
seen = Set()
for line in infile:
    if line not in seen:
        outfile.write(line)
    seen.add(line)
infile.close()
outfile.close()

Verfasst: Montag 28. Februar 2005, 07:06
von jens
Kleine änderung, damit nur neue Line's in seen abgespeichert werden und nicht auch alle doppelten:

Code: Alles auswählen

from sets import Set

infile = open('input.csv', 'r')
outfile = open('output.csv', 'w')
seen = Set()
for line in infile:
    if line not in seen:
        outfile.write(line)
        seen.add(line)
infile.close()
outfile.close()

Verfasst: Montag 28. Februar 2005, 09:13
von Gast
jo, Danke

Da hab ich ja nochmal Glück, wiedereinmal einen Einzelzeiler entkommen. Die Zeilen von jens machen genau das was ich haben wollte und sind dazu noch hübsch zu lesen.

mfg LittleD

Verfasst: Montag 28. Februar 2005, 23:17
von Joghurt
fs111 hat geschrieben:Ein anderer Ansatz wäre die Verwendung eines dictionaries, das zerstört aber auch die Sortierung, d.h. Du müsstest noch mitprotokollieren, was wo hingehört.
Huch! Hab ich was verpasst?
Soweit ich weiss, haben auch Sets keine feste Ordnung.

Verfasst: Dienstag 1. März 2005, 09:10
von jens
Joghurt hat geschrieben:Soweit ich weiss, haben auch Sets keine feste Ordnung.
Das weiß ich eigentlich nicht... Aber egal. Im Beispiel, wird das set ja nur dazu gebraucht, festzuhalten ob die Zeile schon mal abgespeichert wurde... Somit ist die Sortierung egal ;)

Verfasst: Dienstag 1. März 2005, 21:55
von BlackJack
Set ist intern mit einem Dictionary implementiert. Auch das neue, eingebaute `set`, da allerdings direkt in C. (Also in CPython zumindest.)

Verfasst: Donnerstag 3. März 2005, 15:00
von Milan
Hi. Jo, die set's stellen ja nur Mengen dar - da gibt es keine Garantie für Ordnung:

Code: Alles auswählen

>>> a=set("abacabac")
>>> a
set(['a', 'c', 'b'])
>>> list(a) # müsste bei Ordnung ["a","b","c"] liefern...
['a', 'c', 'b']
Aber das hat jens ja ganz nett umgangen :D