Spalten aus einer CSV-Datei schreiben.

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
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

Hallo zusammen :D

ich habe eine ganz normale CSV-Datei vorliegend, es gibt also Spaltenbezeichener, wie ID, Name, Adresse, Telefonnummer, Route, Notebook, usw. Und die Zeilen sind die entsprechenden Einträge. Also:

ID Name Adresse Telefonnummer Route Notebook
0001 Ratna Eifel 12345 A NotebookA
0002 Wolfgang Berlin 23456 B NotebookB
...
Nun, diese Spaltenbezeichner sollen in eine .txt-Datei geschrieben werden. Die .txt-Datei sieht folgendermaßen aus:

ID#Umfeld#Steinig
0001#Laut#Ja
0001#Leise#Nein
0002#Normal#Ja

Am Ende soll dann so aussehen:

ID#Name#Adresse#Telefonnummer#Route#Notebook#Umfeld#Steinig
0001#Ratna#Eifel#12345#A#NotebookA#Laut#Ja
0001#Ratna#Eifel#12345#A#NotebookA#Leise#Nein
0002#Wolfgang#Berlin#23456#B#NotebookB#Normal#Ja

Das Rauter-Zeichen in der .txt-Datei ist so gewollt.

Ich sitze schon seit Stunden und mir fehlen einfach die Ideen. Könnt Ihr vielleicht mal helfen? Ich bin für jede Hilfestellung sehr dankbar. Ich danke Euch..

Gruss,

Eure Ratna :oops:
Trichter
User
Beiträge: 45
Registriert: Montag 20. April 2009, 10:21

Dieses Skript:

Code: Alles auswählen

# erste datei einlesen
file1 = open("input1", "r")
f1_list = []
while True:
    line = file1.readline()
    if len(line) == 0:
        break
    f1_list.append(line.split())

# zweite datei einlesen
file2 = open("input2", "r")
f2_list = []
while True:
    line = file2.readline()
    if len(line) == 0:
        break
    f2_list.append(line.split('#'))

# inhalt der neuen datei erzeugen
output_string = ""
for element2 in f2_list:
    id = element2[0]
    for element1 in f1_list:
        if element1[0] == id:
            newline_list = element1[:] + element2[1:]
            output_string += "#".join(newline_list)

print output_string
ergibt bei mir folgende Ausgabe:

Code: Alles auswählen

ID#Name#Adresse#Telefonnummer#Route#Notebook#Umfeld#Steinig
0001#Ratna#Eifel#12345#A#NotebookA#Laut#Ja
0001#Ratna#Eifel#12345#A#NotebookA#Leise#Nein
0002#Wolfgang#Berlin#23456#B#NotebookB#Normal#Ja
Ich hab hier leider nur Python 2.4. Ansonsten könnte man die input-Dateien mittels with statements einlesen.
BlackJack

@Trichter: Das mag zwar funktionieren, ist aber sicher nicht der Weg über den man das lösen sollte. Das ist ja alles super-umständlich ausgedrückt. Ausserdem kann man auch ohne ``with``-Anweisung Dateien nach gebrauch wieder schliessen.

@ratna_fong: Schau Dir mal das `csv`-Modul aus der Standardbibliothek an. Und überlege welche Information in der jeweiligen Tabelle einen Datensatz eindeutig identifiziert und welche Information Datensätze in beiden Tabellen verbindet.

Dann musst Du nur noch eine der beiden Tabellen in eine geeignete Datenstruktur in den Speicher lesen, so dass über die Information über die die Zuordnung der Datensätze geschieht, einfach auf den betreffenden Datensatz zugegriffen werden kann. Danach kannst Du die zweite Tabelle zeilenweise einlesen, aus der Datenstruktur die zugehörigen Werte aus der anderen Tabelle holen, und das Ergebnis in eine dritte CSV-Datei schreiben.
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

vielen Dank für das Skript, Trichter.

Danke sehr für die Idee, BlackJack.
Wenn ich den Einsatz nach Deiner Idee gehe, dann ist ID die eindeutige Identifizierung der .txt-Datei. In meiner der .txt-Datei gehören in der Tat ALLE Zeilen zu der ID 1. (also, Ratna). D.h. Im Grunde muss ich die Spalten in der .csv-Datei in die .txt-Datei hinzuaddieren.

Das csv-Modul hab ich mir angeguckt. Ich muss ganz ehrlich sagen, die Beschreibungen dort sind mir einfach zu hoch. Außerdem, mir fällt es unheimlich schwer, die Werkzeuge dieses Moduls zu verwenden, weil mir die Idee fehlt.

Die Methode csv.reader(open("datei.csv")) zum Beispiel implementiert ein Iterationsprotokoll.
Ich habe folgendes gemacht:
reader = csv.reader(open("datei.csv"))
Ich konnte nicht auf die einzelne Datensätze zugreifen, hab mit reader.readline() versucht, ging nicht. Weil wie gesagt, reader implementiert eine Iteration, man könnte mit for arbeiten, aber ob mir das weiterbringt, das wage ich zu bezweifeln.

Jungs, Ihr merkt also, ich habe nicht die Idee, die Aufgabe zu lösen. Hätte ich die Idee, müsste ich mich noch mit den Werkzeugen noch vertraut machen. Also, ich bin etwas verzweifelt im Moment.

Hoffentlich könnt Ihr mir mal etwas helfen.

Vielen Dank..

Gruss,

Eure Ratna
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

gehören in der Tat ALLE Zeilen zu der ID 1
Wie soll man sich das bei Deinem Beispiel vorstellen? Du hast ja für die ID "0001" jeweils zwei Zeilen. Wie sollen die eindeutig zusammengefasst werden?
https://www.xing.com/go/invite/18513630.6a91d4
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

ja, stimmt. ich habe mich geirrt. :(

die .txt-Datei sieht so aus:

ID#Umfeld#Steinig
0001#Laut#Ja
0001#Leise#Nein
0001#Normal#Ja


Und dann die .cvs-Datei so:

ID Name Adresse Telefonnummer Route Notebook
0001 Ratna Eifel 12345 A NotebookA
0002 Wolfgang Berlin 23456 B NotebookB

Am Ende soll so eine Datei rauskommen:

ID#Name#Adresse#Telefonnummer#Route#Notebook#Umfeld#Steinig
0001#Ratna#Eifel#12345#A#NotebookA#Laut#Ja
0001#Ratna#Eifel#12345#A#NotebookA#Leise#Nein
0001#Ratna#Eifel#12345#A#NotebookA#Normal#Ja

Also, die .cvs-Datei dient quasi als eine Art Dictionary.

Ich bedanke mich für Eure Hilfe. :)
BlackJack

@ratna_fong: `csv.reader()` liefert einen Iterator. Der hat zum einen die entsprechenden Methoden die jeder Iterator hat, zum Beispiel um das nächste Element abzufragen, und zum anderen kann man darüber in einer ``for``-Schleife iterieren. Du müsstest noch den passenden Spaltentrenner übergeben und dann könntest Du doch einfach mal ausprobieren was das für Elemente sind, die Du beim iterieren bekommst.
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

Weiß vielleicht jemand, wie ich einen Spaltenbezeichner mitten drin in eine Zeile einfügen. Also:

.txt-Datei:

ID#Name#Adresse#Stadt


.cvs-Datei:

ID Vorname Adresse PLZ


Am Ende soll die .txt-Datei so aussehen:

ID#Name#Vorname#Adresse#PLZ#Stadt


Also, was auf der .txt-Datei ist, soll bleiben, und einige aus Spaltenbezeichner aus der .cvs-Datei in die .txt-Datei hinzufügen.

Gruss,

Eure Ratna
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

.cvs-file :

NameID;LastName;Sex;Age;Status;Add
0001;AAA;Male;32;;Something
0002;BBB;Female;23;Single;

.txt-file :

#NameID#FirstName#Street
0001#ForAAA#Paris
0001#ForAAA#Tokyo
0002#ForBBB#Washington
0002#ForBBB#Cologne
0002#ForBBB#Amsterdam


Aus diesen 2 Files muss soll folgende .txt-Datei sein:

#NameID#FirstName#LastName#Street#Sex#Age#Status#Add
0001#AAA#ForAAA#Paris#Male#32##Something
0001#AAA#ForAAA#Tokyo#Male#32##Something
0002#BBB#ForBBB#Washington#Female#23#Single#
0002#BBB#ForBBB#Cologne#Female#23#Single#
0002#BBB#ForBBB#Amsterdam#Female#23#Single#

Ich bin ganz verzweifelt. Kann mir einer bitte helfen?

Eure Ratna
BlackJack

@ratna_fong: Irgendwie zeigts Du hier immer nur Aufgaben die Du lösen sollst, aber kein Stück Eigenleistung. Was hast Du denn schon? Wo genau liegt das Problem? Hast Du das Tutorial schon durchgearbeitet? Sind Dir die Methoden von Datei- und Zeichenkettenobjekten vertraut?
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

Meine Idee ganz zu Anfang war eigentlich:
Vergleiche die 1. Zeile beider Dateien, falls etwas in der .txt-Datei fehlt, dann hinzufügen. Das kriege ich nicht hin.

fileopener = open("datei.csv","rb")

file1 = fileopener.next()

#jetzt möchte ich gerne das Semikolonzeichen der Zeile wegschmeißen und dann in die Wörter in eine Liste reintun
file1 = fileopener.strip(;)

#kommt aber nicht so raus, wie ich das möchte.

och gott.. ich bin verzweifelt. Unter Zeitdruck ist echt mieß.
ratna_fong
User
Beiträge: 38
Registriert: Samstag 3. Juli 2010, 10:43

ich habe zumindest schonmal folgendes:

Code: Alles auswählen

file1 = open("datei1.csv","rb")
ergebnis = file1.next()
ohnesemikolon = ergebnis.split(";")

file2 = open("datei2.txt")
ergebnis2 = file2.next()
ohnerautezeichen = ergebnis2.split("#")

#jetzt muss ich ohnesemikolon und ohnerautezeichen miteinander vergleiche, mal gucken, wenn etwas aus datei1.csv in der #datei2.txt fehlt, dann muss ich die fehlenden zusätzlich reintun
 

Weiss jemand vielleicht, wie ich sie miteinander vergleiche?

Gruss,

Eure Ratna
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

ratna_fong hat geschrieben:och gott.. ich bin verzweifelt. Unter Zeitdruck ist echt mieß.
Eine Programmiersprache (selbst Python) kann man halt nicht mal eben so schnell anwenden. Mindestens ein bis zwei Wochen für die Grundlagen (Tutorial) musst du dir schon nehmen. Ansonsten hat Trichter ja schon ein längeres, unpythonisches Beispiel geliefert.

Grüße
Gerrit
Antworten