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
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
PostgreSQL Datenbank befüllen
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...
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.
- noisefloor
- User
- Beiträge: 3854
- 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
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
-
- 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:
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.
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 ',';
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.
@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
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
@archilles_69
es geht GUT!
also ich hab folgendes mit psql eingegeben:
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
---------------------------------
hoffentlich kommt das jetzt auch formatiert an.
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 ',';
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
---------------------------------
hoffentlich kommt das jetzt auch formatiert an.
@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
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
- noisefloor
- User
- Beiträge: 3854
- 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: 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
@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
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
- 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.
@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
assert encoding_kapiert
@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
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
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@Hyperion:
Gruß, noisefloor
@Hyperion:
Denk' an deine eigenen Wort.Manche User ignoriert man am besten.
Gruß, noisefloor
-
- 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:
In meinem Beispiel hatte ich durch den Zusatz
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
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
Code: Alles auswählen
WITH DELIMITER AS ','
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
@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.
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
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.
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