Hallo Leute, Ich muss automatisiert ein CSV File in eine Table einlesen, wobei das Format nicht fix ist, DB ist Oracle. Spalten (Columns) Reihenfolge des CSVs, also der Header kann sich immer wieder ändern, bzw. auch neue Spalten dazukommen. Brauche nicht alle Spalten, das Naming der gewünschten Spalten bleibt aber gleich. Am besten sollte das CSV zuerst mal in eine Temp Tabelle insertiert werden (Preprocessing/Staging) und ich bereite das gewünschte Format später mit einer View vor. Habe versucht zB mit External Table das zu lösen, da muss man aber alle Felder (Typ, Länge) angeben. Da hab ich einfach 50 Platzhalter Felder (Column Names) angegeben (Field 1...n), und der Header des CSVs ist jetzt in der ersten Zeile (Row) als Record und ab Zeile 2 sind die eigentlichen Daten. Wie gesagt, die Reihenfolge der Spalten kann sich ändern. Wie bringe/schreibe ich am einfachsten diese Daten in eine Tabelle mit fixem Format, heisst die gewünschten Spalten aus dem Header mit den Daten selektieren? klausi
klausi schrieb: > Wie bringe/schreibe ich am einfachsten diese Daten in eine Tabelle mit > fixem Format, heisst die gewünschten Spalten aus dem Header mit den > Daten selektieren? Ob das mit Oracle-Bordmitteln möglich ist, kann ich Dir leider nicht sagen. Aber wenn Du Python zur Verfügung hast, funktioniert eine Dict Comprehension in einer List Comprehension ziemlich gut; das folgende Programm braucht auf meinem alten Q9650 mit 10.000 Zeilen und 10 Spalten in der Eingabe-, sowie ebensovielen Zeilen mit nurmehr 6 Spalten in der Ausgabedatei nur etwa 1,6 bis 1,7 Sekunden. Es ginge deutlich schneller, aber ich wollte es einfach halten.
1 | #!/usr/bin/env python
|
2 | import csv |
3 | |
4 | FILENAME_IN = 'somefile.csv' |
5 | FILENAME_OUT = 'somefile_new.csv' |
6 | KEYS = ['j', 'a', 'd', 'e', 'b', 'c'] |
7 | |
8 | if __name__ == '__main__': |
9 | with open(FILENAME_IN, 'r') as ifh: |
10 | with open(FILENAME_OUT, 'w') as ofh: |
11 | reader = csv.DictReader(ifh) |
12 | writer = csv.DictWriter(ofh, KEYS) |
13 | writer.writeheader() |
14 | writer.writerows([{key: int(line[key]) for key in KEYS} for line in reader]) |
Eingangsdatei hab' ich mal angehängt, ist mit 7zip komprimiert und erzeugt beim Auspacken eine ungefähr 7,2 MB große Ausgabedatei. HTH.
Willst du da ein Tool haben, das dir die Spaltennamen auflistet ? Die relevanten Spalten werden dann von dir ausgewählt und dann in eine temporäre .csv neu geschrieben. Ich würde die erste Zeile (Header) auslesen und in eine Listbox mit Mehrfachauswahl untereinander schreiben. Wenn man sich beim Auslesen der Listbox auch die Stellen merkt, kann man später sehr einfach mit den entsprechenden Stringbefehlen die entsprechenden Teilstrings aus den gelesenen Zeilen der Originaldatei rausfiltern, neu zusammensetzen und neu schreiben.
Sheeva P. schrieb: > Aber wenn Du Python zur Verfügung hast, funktioniert eine Dict > Comprehension in einer List Comprehension ziemlich gut; Aber dann kann der TO auch gleich den das cx_Oracle binding für Python installieren (https://oracle.github.io/python-cx_Oracle/) und muss nicht den Umweg über die Transformierte CSV Datei gehen. Ich bin mir Sicher auch Oracle beherrscht Transactions.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.