Forum: PC-Programmierung CSV File dynamisch einlesen mit PL/SQL


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von klausi (Gast)


Lesenswert?

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

von Sheeva P. (sheevaplug)


Angehängte Dateien:

Lesenswert?

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.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

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.

von Imonbln (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.