web-dev-qa-db-fra.com

Erreur PG COPY: syntaxe d'entrée non valide pour l'entier

Courir COPY donne ERROR: invalid input syntax for integer: "" _ message d'erreur pour moi. Qu'est-ce que je rate?

Ma /tmp/people.csv fichier:

"age","first_name","last_name"
"23","Ivan","Poupkine"
"","Eugene","Pirogov"

Ma /tmp/csv_test.sql fichier:

CREATE TABLE people (
  age        integer,
  first_name varchar(20),
  last_name  varchar(20)
);

COPY people
FROM '/tmp/people.csv'
WITH (
  FORMAT CSV,
  HEADER true,
  NULL ''
);

DROP TABLE people;

Sortie:

$ psql postgres -f /tmp/sql_test.sql
CREATE TABLE
psql:sql_test.sql:13: ERROR:  invalid input syntax for integer: ""
CONTEXT:  COPY people, line 3, column age: ""
DROP TABLE

Trivia:

  • PostgreSQL 9.2.4
37
gmile

ERREUR: syntaxe d'entrée non valide pour l'entier: ""

"" n'est pas un entier valide. PostgreSQL ™ accepte non cité les champs vides comme nuls par défaut en CSV, mais "" serait comme écrire:

SELECT ''::integer;

et échouer pour la même raison.

Si vous voulez gérer un fichier CSV comportant des éléments tels que des chaînes vides entre guillemets pour des entiers nuls, vous devez le transmettre à PostgreSQL via un pré-processeur capable de le nettoyer un peu. L'entrée CSV de PostgreSQL ne comprend pas tous les abus étranges et merveilleux possibles du CSV.

Les options comprennent:

  • Le charger dans un tableur et exporter un fichier CSV sain;
  • Utilisation du module Python csv, Perl Text::CSV, etc. pour le pré-traiter;
  • Utilisation de Perl/Python/what pour charger le fichier CSV et l'insérer directement dans la base de données
  • Utilisation d'un outil ETL tel que CloverETL, Talend Studio ou Pentaho Kettle
23
Craig Ringer

Je pense qu'il est préférable de changer votre fichier csv comme suit:

"age","first_name","last_name"
23,Ivan,Poupkine
,Eugene,Pirogov

Il est également possible de définir votre table comme

CREATE TABLE people (
  age        varchar(20),
  first_name varchar(20),
  last_name  varchar(20)
);

et après la copie, vous pouvez convertir des chaînes vides:

select nullif(age, '')::int as age, first_name, last_name
from people
8
Roman Pekar

J'ai eu cette erreur lors du chargement '|' fichier CSV séparé bien qu’il n’y ait pas de caractères "" "dans mon fichier d’entrée. Il s’est avéré que j’ai oublié de spécifier FORMAT:

COPIER ... DE ... AVEC (FORMAT CSV, DELIMITER '|').

5
Slobodan Savkovic

J'ai eu cette même erreur sur un postgres .sql fichier avec une instruction COPY, mais mon fichier était séparé par des tabulations au lieu de séparé par des virgules et entre guillemets.

Mon erreur est que j'ai copié/collé avec impatience le contenu du fichier à partir de github, mais dans ce processus, tous les onglets ont été convertis en espaces, d'où l'erreur. J'ai dû télécharger et sauvegarder le fichier brut pour obtenir une bonne copie.

5
zwippie

J'ai fini par utiliser csvfix :

csvfix map -fv '' -tv '0' /tmp/people.csv > /tmp/people_fixed.csv

Si vous savez avec certitude quelles colonnes étaient censées être integer ou float, vous pouvez les spécifier simplement:

csvfix map -f 1 -fv '' -tv '0' /tmp/people.csv > /tmp/people_fixed.csv

Sans spécifier les colonnes exactes, on peut avoir un effet secondaire évident: une chaîne vide devient une chaîne avec un 0 personnage.

2
gmile

Il existe un moyen de résoudre "", la chaîne null citée comme nulle dans la colonne entière, utilisez l'option FORCE_NULL:

\copy table_name FROM 'file.csv' with (FORMAT CSV, FORCE_NULL(column_name));

voir le document postgresql, https://www.postgresql.org/docs/current/static/sql-copy.html

2
Charlie 木匠
CREATE TABLE people (
  first_name varchar(20),
  age        integer,
  last_name  varchar(20)
);

"prénom", "âge", "dernier nom" Ivan, 23 ans, Poupkine Eugene , Pirogov

copier les gens de 'file.csv' avec (délimiteur ';', null '');

select * from people;

Juste dans la première colonne .....

1
WSchnuble

cela devrait fonctionner sans que vous modifiiez le fichier csv source:

alter table people alter column age type text;
copy people from '/tmp/people.csv' with csv;
1
soyayix