20

I have csv file that has contents like this:

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

I want to load the csv data into 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]))
)

When I run this command in pgAdmin III tool:

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

I got error:

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

Then I modified the command like this:

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

All failed when tried.

So, anyone can show me the correct COPY command for this case?

null
  • 8,669
  • 16
  • 68
  • 98

4 Answers4

39

Double single quotes (if standard_conforming_strings is on, see the docs)

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

or use the non-standard PostgreSQL-specific escape string:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE E'\'';
Craig Ringer
  • 307,061
  • 76
  • 688
  • 778
  • 2
    If COPY is reserved for the admin users, from psql command line use, \COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE ''''; – ForeverLearner May 26 '17 at 13:15
  • 1
    @Tammy `\copy` gets paths relative to the `psql` client, `COPY` gets them relative to the server host. – Craig Ringer May 29 '17 at 01:33
5

Some other people who are experiencing this error may want to check the file to see if it contains a header on the first line. While it wasn't the problem in your case, it is worth noting the way to work around it:

COPY my_table FROM 'c:\downloads\file.csv' WITH DELIMITER ',' CSV HEADER;
Patrick Parker
  • 4,863
  • 4
  • 19
  • 51
Rupasa Sushma
  • 95
  • 1
  • 11
4

Never mind, I got the answer:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '''';
null
  • 8,669
  • 16
  • 68
  • 98
0

Use this if you have column data present with double quotes in .csv files separated by ,

COPY tablename FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '"';
Adriaan
  • 17,741
  • 7
  • 42
  • 75
ManojRawat
  • 61
  • 1
  • 8