ich versuche gerade leicht verzweifelt mit COPY eine CSV Datei in eine Tabelle zu spulen. In dieser CSV Datei (ca. 500 MB) sind Zahlen in der klassischen deutschen Form 0,00 dargestellt. LC_NUMERIC meiner PG-Installation ist auch auf German eingestellt. Hat jemand eine Idee die mich weiter bringt? Eine Ahnung warum er sich dennoch weigert diese Zahlen richtig zu interpretieren?
Das meint der Fehler:
ERROR: invalid input syntax for type numeric: "0,00"
KONTEXT: COPY table, line 2, column zahl: "0,00"
Auch wenn ich vorher ein
SET LC_NUMERIC TO German;
absetze - das gleiche Problem
aber wie bringe ich dem PG / der Client-Verbindung bei, dass er bitte ein Komma als Dezimal-Trennzeichen verwenden soll ?!
Das hast Du allerdings überlesen. Das wirst Du nun sicher schnell wiederholen & verstehen. Alternativ: eine INPUT-table, in die Du das als Text einliest und dann verarbeitest.
Du könntest auch mit den schon erwähnten Tools awk oder sed das komma in einen Punkt ändern und die Ausgabe in psql pipen. Es gibt da viele elegante Möglichkeiten neben dem üblichen Suchen/Ersetzen in einem Editor deiner Wahl.
und werde ich auch - bzw. habe ich schon …
man darf aber auch bemerken, dass das nicht sehr befriedigend ist auch wenn es andere DBMS gibt die es noch schlechter können
ich war zunaechst etwas optimistisch, weil z.B. ein set client_encoding … und set datestyle bei ähnlichen problemen auf der connection ja auch weiter half - da lag es doch eigentlich nahe, mir für soetwas vgl. triviales wie das komma ein set decimal_separator oder set number_format zu wünschen …
gepatched müsste auch COPY … QUOTE [ AS ] ‘quote’ werden … es ist nicht möglich quote “abzuschalten” z.B. durch ein QUOTE AS ‘’ - da muss man sich immer irgendein Zeichen ausdenken, dass dann hoffentlich nicht in der Datei vorkommt.
Nicht schlecht wäre auch, wenn man die Felder der CSV-Datei explizit auf die Columns der Zieltabelle mappen könnte.
Ich habe selbes Problem wie symbiont… auf einer 8.4.1
Ist mittlerweile eine Lösung verfügbar? Etwa wie oben beschrieben vor dem COPY Befehl etwas wie "Set decimal_seperator = ‘,’; ".
Sonst bleibt nur der Weg die Datei in einem Zwischenschritt zu “bereinigen”?