Aus csv Datei doppelte Einträge entfernen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LittleDeamon
User
Beiträge: 2
Registriert: Sonntag 2. Januar 2005, 15:28

Sonntag 27. Februar 2005, 12:40

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
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Sonntag 27. Februar 2005, 13:34

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
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Gast

Sonntag 27. Februar 2005, 14:13

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
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Sonntag 27. Februar 2005, 14:23

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
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
BlackJack

Sonntag 27. Februar 2005, 23:58

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()
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 28. Februar 2005, 07:06

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()
Gast

Montag 28. Februar 2005, 09:13

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
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Montag 28. Februar 2005, 23:17

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.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 1. März 2005, 09:10

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 ;)
BlackJack

Dienstag 1. März 2005, 21:55

Set ist intern mit einem Dictionary implementiert. Auch das neue, eingebaute `set`, da allerdings direkt in C. (Also in CPython zumindest.)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Donnerstag 3. März 2005, 15:00

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
Antworten