2013-08-18 16 views
21

Uruchamianie COPY w wyniku ERROR: invalid input syntax for integer: "" komunikat o błędzie dla mnie. czego mi brakuje?Błąd COP PG: nieprawidłowa składnia wejściowa dla liczby całkowitej

Moja /tmp/people.csv file:

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

Moja /tmp/csv_test.sql 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; 

wyjściowa:

$ 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 

Ciekawostki:

  1. PostgreSQL 9.2.4

Odpowiedz

15

ERROR: invalid input syntax for integer: ""

"" nie jest liczbą całkowitą. PostgreSQL akceptuje nienotowane puste pola za nieważną domyślnie w formacie CSV, ale "" byłoby jak pisanie:

SELECT ''::integer; 

a nie z tego samego powodu.

Jeśli chcesz poradzić sobie z CSV, który ma takie rzeczy, jak cytowane puste ciągi znaków dla zerowych liczb całkowitych, musisz podać je PostgreSQL za pomocą preprocesora, który może je trochę zmodyfikować. Dane wejściowe CSV PostgreSQL nie rozumieją wszystkich dziwnych i cudownych możliwych nadużyć w CSV.

opcje:

  • załadowaniem go w arkuszu kalkulacyjnym i eksportu sane CSV;
  • Używanie modułu Python csv, Perl Text::CSV, itp. Do wstępnego przetworzenia;
  • Korzystanie Perl/Python/cokolwiek, aby załadować plik CSV i wstawić go bezpośrednio do DB
  • Używanie narzędzia ETL jak CloverETL, Talend Studio lub Pentaho Kettle
6

myślę, że lepiej jest zmienić csv złożyć jak:

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

możliwe jest również zdefiniowanie tabelę jak

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

i po egzemplarzu, można konwertować puste ciągi:

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

zakończyła się robi to za pomocą csvfix:

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

W przypadku wiesz na pewno, które kolumny miały być integer lub float, można podaj je:

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

Bez podania dokładnych kolumn, może wystąpić oczywisty efekt uboczny, w którym pusty ciąg będzie przekształcić w ciąg znaków o znaku 0.

+1

To jest poręczne * narzędzie. –

+0

To jest link do dokumentów dla starej wersji - najnowszy jest zawsze pod adresem http://code.google.com/p/csvfix –

4

miałem ten sam błąd na postgres .sql pliku z COPY oświadczeniu, ale mój plik był zakładka oddzielonych zamiast oddzielonych przecinkami i cytowany.

Mój błąd polegał na tym, że z niecierpliwością kopiuję/wklejałem zawartość pliku z github, ale w tym procesie wszystkie zakładki zostały skonwertowane na spacje, stąd błąd. Musiałem pobrać i zapisać surowy plik, aby uzyskać dobrą kopię.

1

ten powinien pracować bez ciebie modyfikując plik źródłowy csv:

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

To nie działa dla mnie –

+1

odpowiedź zmodyfikowana (i przetestowana) – soyayix

0

Mam ten błąd podczas ładowania „|” oddzielone pliku CSV chociaż nie było '"' znaki w moim pliku wejściowego Okazało się, że zapomniałem podać format:.

... COPY FROM ... Z (formacie CSV, DELIMITER '|')

Powiązane problemy