Hey zusammen,
ich mal wieder.
Ich habe folgendes Problem. Ich möchte gern Daten in eine MySQL Datenbank landen, aber die Daten sind "schlecht formatiert".
Sie sehen im Prinzip so aus:
Spalte 1 | Spalte 2
Buch 1 | Autor1; Autor2; Autor3; Autor4
Buch 2 | AutorX; AutorY; AutorZ
usw.
Jetzt möchte ich es gern umwandeln zu
Spalte 1 | Spalte 2
Buch 1 | Autor1
Buch 1 | Autor2
Buch 1 | Autor3
Buch 1 | Autor4
Nun zur Theorie:
Jetzt könnte ich doch die Spalte 2 in eine Liste laden (; - getrennt) und Sie dann zählen (Anzahl der Elemente = N).
Und dann N Zeilen schreiben mit jeweils Buch 1 in der ersten Spalte und dann dem i ten (i=1...N) Element in Spalte 2
Was meint Ihr? Ist das so umsetzbar?
LG
Kid
Zelleninhalt auf Zeilen verteilen
Hi Sirius3,
Oder meinst Du noch was anderes?
LG
Wieso sollte es nicht gut sein? Es macht doch Sinn so eine relationale Datenbank aufzubauen oder? X Autoren in einer Zelle macht doch erstmal wenig Sinn.Sirius3 hat geschrieben:umsetzbar ist das wohl, aber ob das auch gut ist, ist eine andere Frage.
Oder meinst Du noch was anderes?
LG
@kidchino: Ich denke Sirius3 meinte das Zählen, also `N` und `i` sollten als Variablen nicht im Code auftauchen, die sind unnötig. Und auch bei der Beschreibung im Text ist das etwas umständlich.
Nächste Frage: was sind 'Buch 1' für Werte? Zeichenketten oder eine ID in eine `publication`-Tabelle wo dann der Buchtitel als Zeichenkette steht?
Nächste Frage: was sind 'Buch 1' für Werte? Zeichenketten oder eine ID in eine `publication`-Tabelle wo dann der Buchtitel als Zeichenkette steht?
@kidchino: ich meinte, der Datenbankentwurf sieht mir sehr danach aus, als ob sowohl Spalte 1 als auch Spalte 2 Strings sind, mit dem Namen des Buches und dem Namen des Autors. "Spalte 1" ist auch ein schlechter Name für eine Spalte. Nun kann es ja durchaus vorkommen, dass Bücher gleich heißen (z.B. 1914), oder Autoren den selben Namen haben.
Wenn du das normalisieren willst (was eine gute Idee ist), dann brauchst du eine Tabelle BUCH, eine Tabelle AUTOR und eine Verbindungstabelle BUCH_AUTOR.kidchino hat geschrieben:Was meint Ihr? Ist das so umsetzbar?
Die Tabelle BUCH enthält alle Informationen zu einem Buch außer dem Autor.
Die Tabelle AUTOR enthält alle Informationen zu einem Autor außer den Büchern die er geschrieben hat.
Die Tabelle BUCH_AUTOR enthält in jeweils einem Datensatz die IDs eines Buches und eines Autors.
Damit kannst du dir dann über eine simple Abfrage alle Autoren anzeigen lassen die an einem Buch mitgeschrieben haben und umgekehrt natürlich auch für einen Autor alle Bücher anzeigen lassen an denen er mitgearbeitet hat. Eine Änderung der Autorendaten wie z.B. "gestorben am" erfordert dann nur eine Änderung in der AUTOR-Tabelle und sonst nirgendwo.
Hey zusammen,
so sehen die Rohdaten eigentlich aus:
Ich hatte ein kleines Skript geschrieben, welche eine neue Datei erstellt nur mit Elemement 58 und 1 also dann so aussehen würde:
Die Spalte 1 heißt dann bei mir "paperID", die Spalte 2 würde ich "author" nennen.
Die paperId, die ich vorher der Einfachheit halber als Buch bezeichnet hatte, ist leider ein String, aber einzigartig.
Dass die Autoren gleiche Namen haben ist leider möglich. Es gibt auch eine einzigartige AutorenID, aber die ist erst vor ein paar Jahren eingeführt und daher nun teilweise in meinen Daten vorhanden.
Dies nehme ich erstmal so hin.
VG
so sehen die Rohdaten eigentlich aus:
Code: Alles auswählen
J WONDRATSCHEK, H; JEITSCHKO, W WONDRATSCHEK, H; JEITSCHKO, W TWIN DOMAINS AND ANTIPHASE DOMAINS ACTA CRYSTALLOGRAPHICA SECTION A English Article UNIV KARLSRUHE,INST CRYSTALLOG,D-7500 KARLSRUHE,FED REP GER; DUPONT CO,DEPT CENT RES & DEV,WILMINGTON,DE 19898 JEITSCHKO, Wolfgang/D-7754-2012 JEITSCHKO, Wolfgang/0000-0002-1333-4523 23 97 97 MUNKSGAARD INT PUBL LTD COPENHAGEN 35 NORRE SOGADE, PO BOX 2148, DK-1016 COPENHAGEN, DENMARK 0108-7673 ACTA CRYSTALLOGR A Acta Crystallogr. Sect. A 1976 32 JUL1 664 666 10.1107/S056773947600137X 3 Crystallography Crystallography BY927 WOS:A1976BY92700019
Code: Alles auswählen
WOS:A1976BY92700019 WONDRATSCHEK, H; JEITSCHKO, W
Die paperId, die ich vorher der Einfachheit halber als Buch bezeichnet hatte, ist leider ein String, aber einzigartig.
Dass die Autoren gleiche Namen haben ist leider möglich. Es gibt auch eine einzigartige AutorenID, aber die ist erst vor ein paar Jahren eingeführt und daher nun teilweise in meinen Daten vorhanden.
Dies nehme ich erstmal so hin.
VG
@kidchino: Die IDs von denen wir sprechen sind nicht aus deinen Daten sondern die würde man in der Datenbank einführen. Du möchtest in einem sinnvollen DB-Entwurf in aller Regel keine redundanten Zeichenkettendaten in den Tabellen haben. Man hat eigentlich fast immer einen synthetischen Schlüssel in den Tabellen der sich nicht aus den Daten herleitet die im Datensatz stehen. Ausnahmen davon sind eher selten.
Hey,
danke erstmal schon für die viele Antworten in so kurzer Zeit.
Ich würde dann einfach eine dritte auto-inkremental Spalte einfügen (1,2,3...bis zur Unendlichkeit und noch viel weiter) [Da hat wohl einer nen Clown gefrühstückt heute] und diese dann über die paperID spalte in den anderen Tabellen einfügen.
Aber nochmal zurück zum Anfang. Würde das so sinnvoll gehen in Python? Und bekomme ICH es auch hin?
VG
danke erstmal schon für die viele Antworten in so kurzer Zeit.
Ich würde dann einfach eine dritte auto-inkremental Spalte einfügen (1,2,3...bis zur Unendlichkeit und noch viel weiter) [Da hat wohl einer nen Clown gefrühstückt heute] und diese dann über die paperID spalte in den anderen Tabellen einfügen.
Aber nochmal zurück zum Anfang. Würde das so sinnvoll gehen in Python? Und bekomme ICH es auch hin?
VG
Hey zusammen,
habe es heute endlich mal geschafft mich an das Skript zu machen.
Irgendwie, vielleicht liegts an der Uhrzeit , aber ich hab so gar keine Idee wie ich die Schleife richtig reinbekomme und wo ich ansetzen muss.
Aktuell ist mein Output ja immer nur row [0] und das erste Element in row[1].
Ich würde jetzt soetwas versuchen.
Kann mir jemand einem Tipp geben.
Irgendwie denke ich, dass while auch nicht das richtige ist.
LG
habe es heute endlich mal geschafft mich an das Skript zu machen.
Irgendwie, vielleicht liegts an der Uhrzeit , aber ich hab so gar keine Idee wie ich die Schleife richtig reinbekomme und wo ich ansetzen muss.
Aktuell ist mein Output ja immer nur row [0] und das erste Element in row[1].
Code: Alles auswählen
# -*- coding: utf-8 -*-
import csv, os, sys, re
datei = 'C:/Skripttesten/test/output/Nur Adress ohne Eckige Klammer/test.csv'
csv.field_size_limit(150000000)
liste = []
gesamte_datei = open('C:/Skripttesten/test/output/Zeilenweise.csv', "wb")
with open(os.path.join(datei), "rb") as f:
reader = csv.reader(f, delimiter="\t")
for row in reader:
autoren_spalte = row[1].split(";")
row_umgestellt = [row[0], autoren_spalte[0]]
print(hilfs_var)
liste.append(row_umgestellt)
writer = csv.writer(gesamte_datei, delimiter = "\t")
writer.writerows(liste)
print("Ende - Datein wurde neu formatiert in ", gesamte_datei)
Code: Alles auswählen
laenge_spalte_zwei = len(autoren_spalte)
i = 0
while i < laenge_spalte_zwei+1:
hilfs_var = [row[0], autoren_spalte[i]]
if i = laenge_spalte_zwei+1
Irgendwie denke ich, dass while auch nicht das richtige ist.
LG
@kidchino: Über die Elemente einer Liste kann man mit ``for`` iterieren. Das sind Grundlagen…
Hi Blackjack,
Was meint Ihr hierzu?
Spricht das was dagegen?
LG
KID
Da hast Du vollkommen recht. War wohl doch zu spät gestern und zu wenig schlaf.BlackJack hat geschrieben:@kidchino: Über die Elemente einer Liste kann man mit ``for`` iterieren. Das sind Grundlagen…
Was meint Ihr hierzu?
Code: Alles auswählen
# -*- coding: utf-8 -*-
import csv, os, sys, re
datei = 'C:/Skripttesten/test/output/Nur Adress ohne Eckige Klammer/test.csv'
csv.field_size_limit(150000000)
liste = []
gesamte_datei = open('C:/Skripttesten/test/output/Zeilenweise.csv', "wb")
with open(os.path.join(datei), "rb") as f:
reader = csv.reader(f, delimiter="\t")
for row in reader:
autoren_spalte = row[1].split(";")
laenge_spalte_zwei = len(autoren_spalte)
i = 0
for i in range (0,laenge_spalte_zwei, 1):
print (i)
neue_anordnung = [row[0], autoren_spalte[i]]
i=i+1
print(neue_anordnung)
liste.append(neue_anordnung)
writer = csv.writer(gesamte_datei, delimiter = "\t")
writer.writerows(liste)
print("Ende - Datein wurde neu formatiert in ", gesamte_datei)
LG
KID
@kidchino: Zeilen 14 und 19 sind total überflüssig, weil i ja schon von der for-Schleife gesetzt wird. Das drei-parametrige range hätte genausogut mit einem Parameter geschrieben werden können. Aber, Zeile 15 ist ein Anti-Pattern, weil man direkt über die autoren_spalte iterieren kann.
Ungetestet:
Ungetestet:
Code: Alles auswählen
liste.extend([row[0], a] for a in row[1].split(';'))
Hi Sirius3,
danke!
Das ist ganz okay, denke ich: http://lignos.org/py_antipatterns/.
Ist es so besser?
LG
kid
danke!
Auf jeden Fall ! DankeSirius3 hat geschrieben:@kidchino: Zeilen 14 und 19 sind total überflüssig, weil i ja schon von der for-Schleife gesetzt wird.
Stimmt, ja! DankeSirius3 hat geschrieben:@kidchino: Das drei-parametrige range hätte genausogut mit einem Parameter geschrieben werden können.
Aber damit kann ich leider nichts anfangen Ich google gerade nach Anti-Pattern, finde aber nicht das, was für mich ausreichend verständlich ist.Sirius3 hat geschrieben:@kidchino: Aber, Zeile 15 ist ein Anti-Pattern, weil man direkt über die autoren_spalte iterieren kann.
Das ist ganz okay, denke ich: http://lignos.org/py_antipatterns/.
Ist es so besser?
Code: Alles auswählen
...
laenge_spalte_zwei = len(autoren_spalte)
for i in range (laenge_spalte_zwei):
neue_anordnung = [row[0], autoren_spalte[i]]
liste.append(neue_anordnung)
...
kid
Das verstehe ich zwar schon, aber kann ich nicht so einfach nachbauen bzw. nachvollziehen. Trotzdem danke.Sirius3 hat geschrieben:@kidchino: Ungetestet:Code: Alles auswählen
liste.extend([row[0], a] for a in row[1].split(';'))
Seht Ihr bei meiner Version noch großes Fehlerpotential irgendwo?
LG
BTW: Hammer, wie viele Fehler ich beim Schreiben immer mache... Sorry dafür. Teilweise finde ich das ziemlich spannend und schreib recht schlecht (was ich nicht kann) und freue mich wie ein Keks, wenn ich die Skripte (mehr oder weniger allein ) zum laufen bringe.
-
- User
- Beiträge: 37
- Registriert: Donnerstag 17. Mai 2012, 21:28
@kidchino
Wenn Du einfach mal im Forum stöberst, findest Du seehr viel zum Thema Anti-Pattern, zum Beispiel hier.kidchino hat geschrieben:Ich google gerade nach Anti-Pattern, finde aber nicht das, was für mich ausreichend verständlich ist.
Das ist ganz okay, denke ich: http://lignos.org/py_antipatterns/.