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:
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:
csv
, Perl Text::CSV
, etc. pour le pré-traiter;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
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 '|').
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.
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.
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
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 .....
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;