csv-Datei mit COPY einlesen

Hallo,

versuche gerade eine csv-Datei, die bei mir unter dem beschriebenen Pfad liegt, einzulesen, meine Syntax muss aber falsch sein.

“filename
The absolute path name of the input or output file. Windows users might need to use an E’’ string and double backslashes used as path separators.”
hilft mir leider nicht wirklich weiter, bin aber windows user…


CREATE TABLE IMPORT_TEST
(
Personalnummer Numeric(5,0) NOT NULL,
Vorname CHAR(30),
Name CHAR (30) NOT NULL,
Strasse CHAR (30),
PLZ CHAR (6),
Ort CHAR (30),
Geburt DATE,
Geschlecht CHAR (1),
Gehalt NUMERIC(6,2),
CONSTRAINT pnr PRIMARY KEY (Personalnummer)
)
;

COPY IMPORT_TEST
    FROM { ' C:\Programme\PostgreSQL\8.4\test.csv ' }
[ DELIMITER ';' ]
;

Vielen Dank
Carsten

Du sollst den Pfad halt so angeben:

test=*# select E'c:\\kack\\windows' as "FAT Pfad";
    FAT Pfad
-----------------
 c:\kack\windows
(1 row)

Deine geschweiften Klammern sind fehl am Platz, aber ich versteh, wie Du drauf kommst:

test=*# \h copy
Command:     COPY
Description: copy data between a file and a table
Syntax:
COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | STDOUT }
    [ [ WITH ] ( option [, ...] ) ]

where option can be one of:

    FORMAT format_name
    OIDS [ boolean ]
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    HEADER [ boolean ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column_name [, ...] ) | * }
    FORCE_NOT_NULL ( column_name [, ...] ) |
    ENCODING 'encoding_name'

Hint: Syntaxdarstellungen haben ihre eigene Syntax :wink: Geschweifte Klammern geben Parameter an, eckige Optionen.


Ach ja: NUMERIC als Datentyp für die Personalnummer: bist Du Dir sicher?

Andreas

o.k. habe es hiermit versucht.

COPY IMPORT_TEST
    FROM E'c:\\Programme\\PostgreSQL\\8.4\\test.csv '
 DELIMITER ';'
 ;

Das Ergebnis ist schon besser, aber mit der Fehlermeldung komme ich nicht klar.

HINWEIS:  CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »pnr« für Tabelle »import_test«
FEHLER:  Relation »pnr« existiert bereits
********** Fehler **********
FEHLER: Relation »pnr« existiert bereits
SQL Status:42P07

Es wird keine Tabelle generiert, aber die Spalte pnr soll doch schon existieren? Hängt das mit den Spaltenüberschriften in der csv zusammen?

Und über das NUMERIC habe ich mir wirklich keine Gedanken gemacht. Erst mal stumpf abgeschrieben. Ich habe in meinem echten Projekt noch diverse Spalten z.B. mit Datumsformaten von 12.08.1963 über 00.00.1963 bis 00.06.2000 vor mir. Da werde ich noch genug fluchen und richtig nachdenken müssen.

Carsten

Mit

CONSTRAINT pnr PRIMARY KEY

hast Du wohl einen Index erzeugt mit diesem Namen. Und pg_class hat nun mal diesen Index:

"pg_class_relname_nsp_index" UNIQUE, btree (relname, relnamespace)

Mit anderen Worten: Du kannst nicht im selben Schema 2 Objekte (Tabelle, Index, …) mit demselben Namen haben.

Mit deinen ‘kapotten’ Datumswerten wirst noch viel Spaß haben, denn PG ist extrem strikt und ein 00.00.1963 existiert halt einfach nicht -> ERROR. Fluche darüber, aber fluche nicht über PG, sondern über den Bitmüll, der sowas als Datum akzeptiert.


Andreas

Die Datumswerte sind leider nur ein anschauliches Beispiel und nur die Spitze des Eisbergs. In dem was ich “geerbt” habe ist alles Denkbare zu finden! :angry: Trotzdem muss das nun von Windows 98 und dBase raus und in postgreSQL rein. Da wird noch viel Gefluche kommen, aber tatsächlich nicht über PG.

Carsten

Ich sehe: Du bist auf dem Wege der Besserung!

Andreas