2012-10-12 18 views
9

は、私はこのような内容を持つCSVファイルを持っている:シングルクォートのデータを持つcsvファイルからpostgreSQLデータをロードする正しいCOPYコマンドはありますか?

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

私はMY_TABLEにCSVデータをロードします。

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])) 
) 

私はpgAdminでIIIツールで次のコマンドを実行します。

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

私はエラーを得た:

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

は、その後、私は、このようなコマンドを修正:

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 \; 

試してみるとすべて失敗しました。

だから、誰でも私にこのケースの正しいCOPYコマンドを表示できますか?

答えて

20

ダブル単一引用符(standard_conforming_stringsが上にある場合、the docsを参照してください)

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

または非標準のPostgreSQL固有escape string使用:

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

+1 Ah!よくやった。 – Meem

+1

adminユーザーのためにCOPYが予約されている場合は、psqlのコマンドラインから、\ COPY my_table FROM 'c:\ downloads \ file.csv' DELIMITERS '、' CSV QUOTE '' ''; – Tammy

+0

@Tammy '\ copy'は' psql'クライアントからの相対パスを取得し、 'COPY'はサーバホストからの相対パスを取得します。 –

1

気にしないで、私は答えました:

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

この問題が発生している他の人々最初の行にヘッダーが含まれているかどうかを確認することができます。あなたの場合はそれほど問題ではありませんでしたが、回避する方法は注目に値します。

COPY my_table FROM 'c:\downloads\file.csv' WITH DELIMITER ',' CSV HEADER; 
関連する問題