2012-10-12 18 views
9

devo file CSV che ha un contenuto di questo tipo:Il comando COPY corretto per caricare i dati postgreSQL dal file csv che contiene dati a virgolette singole?

10,53073,0,0,'Y','2008-05-30 21:46:55',0,'2008-05-30 21:48:04',0,53071,2 

voglio caricare i dati CSV in my_table.

CREATE TABLE my_table 
(
    ad_tree_id numeric(10,0) NOT NULL, 
    node_id numeric(10,0) NOT NULL, 
    ad_client_id numeric(10,0) NOT NULL, 
    ad_org_id numeric(10,0) NOT NULL, 
    isactive character(1) NOT NULL DEFAULT 'Y'::bpchar, 
    created timestamp without time zone NOT NULL DEFAULT now(), 
    createdby numeric(10,0) NOT NULL, 
    updated timestamp without time zone NOT NULL DEFAULT now(), 
    updatedby numeric(10,0) NOT NULL, 
    parent_id numeric(10,0), 
    seqno numeric(10,0), 
    CONSTRAINT ad_treenodemm_pkey PRIMARY KEY (ad_tree_id , node_id), 
    CONSTRAINT adtree_adtreenodemm FOREIGN KEY (ad_tree_id) 
     REFERENCES ad_tree (ad_tree_id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, 
    CONSTRAINT ad_treenodemm_isactive_check CHECK (isactive = ANY (ARRAY['Y'::bpchar, 'N'::bpchar])) 
) 

Quando eseguo questo comando in pgAdmin III strumento:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV; 

ho ottenuto l'errore:

ERROR: value too long for type character(1) 
CONTEXT: COPY my_table, line 1, column isactive: "'Y'" 

Poi ho modificato il comando come questo:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '''; 
COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '\''; 
COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '\'' ESCAPE '\'; 
COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '\'' ESCAPE \; 

Tutto fallito quando provato.

Quindi, chiunque può mostrarmi il comando COPY corretto per questo caso?

risposta

20

virgolette singole doppie (se standard_conforming_strings è accesa, vedere the docs)

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE ''''; 

o utilizzare il non-standard specifico PostgreSQL-escape string:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE E'\''; 
+0

+1 Ah! ottimo lavoro. – Meem

+1

Se COPY è riservato agli utenti amministratori, da riga di comando psql, \ COPY my_table FROM 'c: \ downloads \ file.csv' DELIMITERS ',' CSV QUOTE '' ''; – Tammy

+0

@Tammy '\ copy' ottiene percorsi relativi al client' psql', 'COPY' li ottiene relativi all'host del server. –

1

Non importa, ho avuto la risposta:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE ''''; 
2

Alcune altre persone che stanno vivendo questo er potrebbe volere controllare il file per vedere se contiene un'intestazione sulla prima riga. Mentre non era il problema nel tuo caso, vale la pena notare il modo di aggirarlo:

COPY my_table FROM 'c:\downloads\file.csv' WITH DELIMITER ',' CSV HEADER;