2013-08-18 33 views
21

COPYを実行するとERROR: invalid input syntax for integer: ""エラーメッセージが表示されます。私は何が欠けていますか?PG COPYエラー:整数の入力構文が無効です

マイ/tmp/people.csvファイル:

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

マイ/tmp/csv_test.sqlファイル:

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; 

出力:

$ 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 

トリビア:

  1. のPostgreSQL 9.2.4

答えて

15

ERROR: invalid input syntax for integer: ""

""は有効な整数ではありません。 PostgreSQLは、CSVではデフォルトでヌルとして引用符で囲まれていない空白のフィールドを受け入れますが、""は書き込みのように次のようになります。

SELECT ''::integer; 

と同じ理由で失敗します。

ヌル整数のために引用符で囲まれた空文字列を持つCSVを処理したい場合は、それを少し上に置き換えることができるプリプロセッサを介してPostgreSQLにフィードする必要があります。 PostgreSQLのCSV入力は、CSVの奇妙で素晴らしい可能性のあるすべての悪用を理解していません。

のオプションがあります。

  • スプレッドシートでそれをロードし、健全なCSVをエクスポートします。
  • Python csvモジュール、Perl Text::CSVなどを使用して前処理します。 CSVをロードし、私はそれがあなたのCSVファイルを変更した方が良いと思う
6

CloverETL、Talendのメーカー、またはPentahoのケトルなどのETLツールを使用してDB

  • に直接挿入するために何のPerl/Pythonのを/使用
  • 以下のようなファイル:それはあなたのようなテーブルを定義することも可能です

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

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

    コピーした後、あなたは空の文字列に変換することができますすることができます、列がintegerまたはfloatであることを意味していたあなたは確実に知る場合

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

    csvfixを使用して、これをやってしまった
    select nullif(age, '')::int as age, first_name, last_name 
    from people 
    
  • 2

    をちょうどそれらを指定します。ここで、空白の文字列がする

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

    正確な列を指定せずに、一つは、明白な副作用が発生する可能性があります0文字の文字列に変換する必要があります。

    +1

    これは便利なツールです –

    +0

    これは古いバージョンのドキュメントへのリンクです - 最新のものはいつもhttp://code.google.com/p/csvfixにあります –

    4

    私はCOPY声明ではpostgres .sqlファイル上でこの同じエラーを持っていましたが、私のファイルはタブ区切りの代わりカンマ区切りとを引用しました。

    私の間違いは、githubからファイルの内容を熱心にコピー/貼り付けていたことですが、そのプロセスではすべてのタブがスペースに変換されてエラーになりました。私は良いコピーを得るために生のファイルをダウンロードして保存しなければならなかった。

    1

    これはあなたがソースcsvファイルの変更なしで動作するはず:

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

    それは私には役に立たない –

    +1

    答えが変更された(テストされた) – soyayix

    0

    をロードするときに、私はこのエラーを得ました「|」私の入力ファイル内に '"' 文字があったものの、CSVをファイル分離それは私がFORMAT指定し忘れたことが判明:

    COPYを... WITH ... FROM(FORMAT CSV、DELIMITER '|')。 。

    関連する問題