PostgreSQL Datenbank befüllen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

Hallo,
ich will eine Postgresql-Datenbank befüllen mit einer Datei im CSV-Format.
Die Struktur der Datenbank ist,
CREATE TABLE product(
id secondary key,
art_nr primary key,
kostenstelle varchar(),
mitarbeiter varchar(),
ist_zeit time,
soll-zeit time,
personal_nr varchar(),
deckungsbeitrag integer
);

Diese Text/Stammdatei hätte folgenden 1.Datensatz
1,"123-345-5/2","Vorrichterei","Mustermann",12,20,"123456789",35
Man kann das auch händisch eingeben- Satz für Satz, aber es sind 5000 artikel einzugeben!
Feldtrenner sind , auch \t ist möglich aber bleiben wir bei ,
Danke im Voraus.

Fritz 8)
Die art_nr wird mit Prüfsumme eingegeben, wobei die Quersumme ausreicht.
1+2+3+3+4+5+5= 23/7 = 23 mod 7=2 also Prüfsumme 2
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Gut, dass du uns bei deinem Vorhaben auf dem Laufenden hälst, aber was ist eigentlich die Frage? ;-) Eine fertige Lösung wird es sicher nicht geben.

Eine Kleiningkeit noch: Schreibe doch bitte nicht jeden Satz in eine einzelne Zeile, das ist unglaublich nervig beim Lesen. Mein Browser möchte gerne selber entscheiden, wann er die Zeilen umbricht. Ach ja, Code-Tags existieren noch immer...
Das Leben ist wie ein Tennisball.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

zwei Möglichkeiten:

1. Du importierst die CSV-Datei über ein Tool in PostgreSQL - keine Ahnung, was es da so gibt. Bei MySQL geht es über phpmyadmin ziemlich simpel.
2. Du schreibst dir ein kleines Python-Skript, was die Datensätzen zeilenweise einliest und in die DB schreibt.

BTW: Warum ist die Personalnummer den varchar und nicht integer? ;-)

Gruß, noisefloor
achilles_69
User
Beiträge: 21
Registriert: Dienstag 31. März 2009, 14:05
Wohnort: Bielefeld

Hallo Fritz,

Du kannst COPY benutzen. In der Shell psql zum Beispiel:

Code: Alles auswählen

COPY product (id, art_nr, kostenstelle, mitarbeiter, ist_zeit, soll_zeit, personal_nr, deckungsbeitrag) FROM '/PFAD/WO/DEINE/DATEN/LIEGEN' WITH DELIMITER AS ',';
Die Felder und deren Reihenfolge muss natürlich an die Reihenfolge in der CSV-Datei angepasst werden. Beim Pfad zur Datei ist es wichtig, diesen absolut anzugeben. Bei Linux/Unix also bei der Wurzel '/' beginnend.

Was mir noch einfällt: die Datei muss auch vom PostgreSQL-Server "sichtbar" sein, also im Dateisystem der Maschine auf der der Server läuft liegen.

Was die Prüfsumme angeht, weiß ich jetzt nicht genau, was Du meinst. Falls irgendwelche Berechnungen durchgeführt werden sollen, müsstest Du wahrscheinlich die Prüfsumme erst in eine Hilfsspalte importieren und anschließend mit einem entsprechenden UPDATE in die richtige Spalte übertragen.
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@archilles_69
Danke erstmal.
Mein Server läuft auf localhost, also auf derselbe Maschine, wie der client. Mit der Prüfsumme ist nich so wichtig es geht erstmal um die COPY-Funktion.
Die Prüfroutine der Quersumme ist eine alte Prüfroutine um einfach nachprüfen zu können, ob die Information stimmt.
ob die Personalnummer nun varchar oder text oder int ist, das spielt keine rolle, weil indexiert (und sortiert) wird nach dem Primary key.
Ich kann mir auch vorstellen, das mySQL und PostgrSQL ähnliche COPY-Funktionen haben.
Nun hab ich entdeckt, das pySide auch die Qsql-Funktionen unterstützt. Siehe dazu meine Pastebin-Datei.
Aber QPSQL (die Postgresql) wird nicht unterstützt, was natürlich schlecht wäre.
Grüße Fritz
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@archilles_69
es geht GUT!
also ich hab folgendes mit psql eingegeben:

Code: Alles auswählen

COPY europa (land,plz,date) FROM '/home/fritz/europa1.txt' WITH DELIMITER ',';
Der Einfachheit hlber hab ich 1 Datenbank mit folgender Struktur angelegt:
europa (
id integer,
land varchr(80),
plz integer,
date date);
Der Witz beim Copy ist die Struktur der Stammdatendatei:
"De",45234,"2010-1-1"
"BE",3453,"2010-1-2"
die Trenner dürfen nur in dem Datensatz vorkommen,
"De",45234,"2010-1-1",
"BE",3453,"2010-1-2"
das wäre falsch.
Jetzt wird 1 Python-funktion damit geschrieben und dann ist die Aufgabe erledigt.
Nochmals danke für Deinen Hinweis.
Guude!
Fritz :lol:
---------------------------------
hoffentlich kommt das jetzt auch formatiert an.
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@archilles_69
mir ist noch was aufgefallen:
In der Stammdatei brauchen die Stringfelder nicht in "" zu stehen, das macht postgresql automatisch.
Also
DE,12345,2010-1-10A
.
.
.
.
LX,2345,2009-1-20A
Die Daten-Felder müssen mit , getrennt werden, die datensätze mit 0A in Unix
Schau die mal das an mit hexer europa.txt, wobei meine Datei europa.txt heist.
hexer gibts auf dem UBUNTU-Repository.
apt-get install hexer.

Der Satztrenner unter Win wäre 0A0D
Das python-script ist demnach auch keine Hexerei.
MFG
Fritz 8) 8)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@3ff: Wenn du endlich mal Struktur in deine Postings bringen würdest wären diese mit Sicherheit besser lesbar und verständlich...

zum Thema:

Wenn man eine Datei mit "CSV-ähnlicher" Struktur importiert, dann sollte man nicht nur den Delimiter angeben, sondern auch den Quote-Character und den Escape Character. Sonst hat man auf einmal " an stellen stehen, wo keine sein sollen. Das ist aber auch in der Doku zu PostgreSQL Copy beschrieben.

Gruß, noisefloor
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@noisefloor,
das darf nicht war sein...
Vielen dank für Deine "produktiven" Kommentare.
Ich muß mich zurückhalten, weil alle Kommentare übers Netz gehen und in irgendwelchen Silicon-Valleys landen.
Bitte lies doch mal meinen Beitrag an archille_69 durch. Wenn die Datenstruktur von der Importdatei nicht stimmt, wird diese Datei erst garnicht von Postgres importiert. Mir escape sequenzen hat das überhaupt nichts zu tun.
Es gibt keine einheitliche Struktur bei den CSV-Dateien. Da macht jeder Hersteller, was er will. Oracle hat als Feldtrenner z. B. das : und verschiedene Handyanbieter nehmen was sie grad wollen.
Es ist immer 1 ascii-Datei aber Satztrenner und Datentrenner sind jeweils unterschiedlich.
Das Dateiende-Zeichen wird auch unterschiedlich eingesetzt.
Android oder Symbian unterscheiden sich.
Wer lesen kann, hat Vorteile.
Mittlerweile bin ich schon 1 Schritt weiter, die COPY-Funktion funktioniert auch mit Qt4. Da gibts hier im Forum auch 1 Beispiel von mir.
Schönen Sonntag noch
Fritz
8) 8)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@noisefloor: Manche User ignoriert man am besten. Die Postings mit diesen unzähligen Absätzen erzeugen ja fast schon Augenkrebs, vom Ausdruck und dem Aufbau mal ganz zu schweigen.

@3ff:Ich würde hier nicht User abwatschen, die versuchen Dir zu helfen. Dein obiges Posting hat nahegelegt, dass Du da durchaus ein Escape-Problem haben könntest. Speziell als Neuling hier im Forum sollte man schon mal ein wenig zurückhaltender auftreten. Schließlich fragst Du hier ja, weil Du von vielen Dingen noch keine Ahnung hast. Und wenn eben mal ein Posting kommt, welches nicht direkt ein Problem trifft, dann kann man ggf. auch aus diesen Anmerkungen etwas für die Zukunft lernen.
Desweiteren sollte man sich eher selber hinterfragen, wenn Antworten kommen, die - der eigenen Meinung nach zumindest - in die falsche Richtung laufen. Liegt das nicht dann evtl. an seinen Postings? Hat man nicht klar genug formuliert? Das solltest Du Dich eher fragen, anstatt andere Leute hier dümmlich anzumachen.

Als letzte Anmerkungen:

Wieso nutzt Du jetzt teilweise Code-Tags, bei Beispiel Daten dann aber wieder nicht? Das macht es nicht wirklich besser, Deine Postings zu lesen und das Problem zu verstehen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@Hyperion,
Du hast es auch noch nicht geschnallt!
Das hat weder mit escapesequenzen oder ähnlichem zu tun.
Mein Postgres akzeptiert nur dateien im CVS-Format, wenn sie ein ganz bestimmtes Format haben, genau das hab ich archilles_69 mitgeteilt nicht mehr und nicht weniger!
Abgewatscht sieht anders aus, die CVS-Datei darf:
-nur als Textdatei erstellt werden
-es gibt das Komma , als Feldtrenner
-das hex0a als Datensatztrenner
und kein Dateiendezeichen.
Da ich auch selber lesen kann (auch englisch), hab ich auch die DOKU gelesen und da stehen die verschiedenen Möglichkeiten eine CSV-Datei aufzubauen.
Mal 1 gundsätzliche Frage: warum bist Du denn Mitglied in diesen (einzigen deutschen) forum?
Weißt du alles?
Ich hab mich nur darüber erregt, das mit jemand die DOKU, die ich schon mehrfach durchgelesen hatte, erneut vorsetzen will.
Hoffentlich sind jetzt alle Klarheiten beseitigt, denn sowas ist unproduktiv.
Guude!
Fritz
:idea:
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Hyperion:
Manche User ignoriert man am besten.
Denk' an deine eigenen Wort. ;-)

Gruß, noisefloor
achilles_69
User
Beiträge: 21
Registriert: Dienstag 31. März 2009, 14:05
Wohnort: Bielefeld

@3ff:

Mein COPY-Befehl bezog sich auf Deine Beispieldaten. Feldtrenner etc. kann man aber angeben:

Code: Alles auswählen

http://www.postgresql.org/docs/8.4/static/sql-copy.html
In meinem Beispiel hatte ich durch den Zusatz

Code: Alles auswählen

WITH DELIMITER AS ','
das Komma als Trennzeichen zwischen den Feldern angegeben. Man kann hier natürlich auch andere Zeichen angeben.
Genau so kann man auch das Quoting und Escape-Zeichen angeben. Siehe hierzu meinen Link auf die offizielle PostgreSQL-Doku. Dort wird der COPY-Befehl genau erklärt.

VG
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@achilles_69
genau.
Ich hab vershiedene Datenformate ausprobiert. Psql bleibt jedesmal stehen, wenn die Datei *.csv nicht die "richtige" Struktur hat.
Ich hab letzte Woche 1 ganzen Nachmittag rumgedreht, bis ich die richtige Struktur hatte. Man kann auch vereinbaren, das Dateiende soll sein: \. Das wäre eine Escape-sequenz. :idea:
Die DOKU hab ich.
Oracle nimmt als Feldtrenner das : andere nehmen wieder andere Ascii-Zeichen
Egal es, funktioniert mit dem Feldtrenner ,
Nun geht es los mit einer Datenerfassung via Handy.
Da werden die Messergebnisse eingegeben und zum PC übertragen via SMS.

Inzwischen hab ich mit Qt4 unter PySide gearbeitet. Dann hat mir dankenswerter Weise ein Kollege aus diesem Forum 1 Link für die BIB-QPSQL gesendet. Jetzt "versteht" mein Qt4 auch die Postgresql.
Die Abfrage der PSQL hab ich in der Pastebin hinterlegt. Abfragen funktionieren. Andere SQL-Funktionen auch.

So will ich mich mit Qt wieder vertragen, weil die Möglichkeiten grade des Moduls qt4uic und des Resoucecompilers einfach großartig sind.
Die Verbindung Qt4 und PostgreSQL sind schon interessant und ich werd da weiter "forschen".
Man kann mit Qt4 professionelle Anwendungen schreiben, mit tkinter allerdings auch!
Grüße Fritz
8) 8)
Antworten