web-dev-qa-db-fra.com

La commande COPY correcte pour charger les données postgreSQL à partir d'un fichier csv contenant des données entre guillemets?

J'ai un fichier csv qui a un contenu comme celui-ci:

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

Je veux charger les données CSV dans 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]))
)

Lorsque j'exécute cette commande dans l'outil pgAdmin III:

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

J'ai eu une erreur:

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

Puis j'ai modifié la commande comme ceci:

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

Tout a échoué quand essayé.

Ainsi, n'importe qui peut me montrer la commande COPY correcte pour ce cas?

13
null

Guillemets simples (si standard_conforming_strings est activé, voir la documentation )

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

ou utilisez le non-standard spécifique à PostgreSQL chaîne d'échappement :

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

Certaines personnes rencontrant cette erreur peuvent vouloir vérifier le fichier pour voir s'il contient un en-tête sur la première ligne. Bien que ce ne soit pas le problème dans votre cas, il convient de noter le moyen de le contourner:

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

Qu'à cela ne tienne, j'ai la réponse:

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