2013-08-18 32 views
21

In esecuzione COPY risultati in ERROR: invalid input syntax for integer: "" messaggio di errore per me. Cosa mi manca?Errore COPY PG: sintassi di input non valida per intero

mio /tmp/people.csv di file:

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

mio /tmp/csv_test.sql di file:

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; 

uscita:

$ psql postgres -f 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 

Curiosità:

  1. PostgreSQL 9.2.4

risposta

15

ERROR: invalid input syntax for integer: ""

"" non è un numero intero valido. PostgreSQL accetta non quotate campi vuoti come null per impostazione predefinita in CSV, ma "" sarebbe come la scrittura:

SELECT ''::integer; 

e non riescono per lo stesso motivo.

Se si desidera trattare con CSV che ha cose come le stringhe vuote tra virgolette per numeri interi nulli, è necessario inviarlo a PostgreSQL tramite un pre-processore che può essere migliorato un po '. L'input CSV di PostgreSQL non comprende tutti gli strani e meravigliosi possibili abusi di CSV.

Le opzioni includono:

  • di caricarla in un foglio di calcolo e l'esportazione di CSV sano di mente;
  • Utilizzo del modulo Python csv, Perl Text::CSV, ecc. Per pre-elaborarlo;
  • Utilizzo di Perl/Python/qualunque cosa per caricare il CSV e inserirla direttamente nel DB
  • Utilizzando uno strumento di ETL come CloverETL, Talend Studio o Pentaho Kettle
6

Penso che sia meglio cambiare il vostro csv di file come:

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

E 'anche possibile definire il vostro tavolo come

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

e dopo la copia, è possibile convertire le stringhe vuote:

select nullif(age, '')::int as age, first_name, last_name 
from people 
2

finito per fare questo usando csvfix:

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

Nel caso in cui si sa per certo che le colonne sono state destinate ad essere integer o float, è possibile specificare solo loro:

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

Senza specificare le colonne esatte, si può verificare un evidente effetto collaterale, in cui una stringa vuota essere trasformato in una stringa con un carattere 0.

+1

Questo è uno strumento * a portata di mano. –

+0

Questo è un collegamento ai documenti per una versione precedente: l'ultimo è sempre http://code.google.com/p/csvfix –

4

Ho avuto questo stesso errore su un Postgres .sql file con una dichiarazione COPY, ma il mio file era separato da tabulazioni invece di separati da virgole e citato.

Il mio errore è stato che ho copiato/incollato con impazienza il contenuto del file da github, ma in quel processo tutte le schede sono state convertite in spazi, quindi l'errore. Ho dovuto scaricare e salvare il file raw per ottenere una buona copia.

1

questo dovrebbe funzionare senza di te modificare il file di origine CSV:

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

Non funziona per me. –

+1

risposta modificata (e testata) – soyayix

0

ho ottenuto questo errore durante il caricamento di '|' separato file CSV, anche se non ci fossero '"' personaggi del mio file di input Si è scoperto che ho dimenticato di specificare il formato:.

COPIA ... FROM ... CON (formato csv, DELIMITER '|')

Problemi correlati