68

実行COPYするとERROR: invalid input syntax for integer: ""エラーメッセージが表示されます。私は何が欠けていますか?

私の/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 /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

トリビア:

  • PostgreSQL 9.2.4
4

12 に答える 12

44

エラー: 整数の入力構文が無効です: ""

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

SELECT ''::integer;

同じ理由で失敗します。

null 整数に対して引用符で囲まれた空の文字列などを含む CSV を処理する場合は、それを少しきれいにすることができるプリプロセッサを介して PostgreSQL にフィードする必要があります。PostgreSQL の CSV 入力は、CSV の奇妙で素晴らしい悪用の可能性をすべて理解しているわけではありません。

オプションは次のとおりです。

  • スプレッドシートにロードし、正常な CSV をエクスポートします。
  • Pythoncsvモジュール、PerlText::CSVなどを使用して前処理します。
  • Perl/Python/whatever を使用して CSV をロードし、DB に直接挿入します
  • CloverETL、Talend Studio、Pentaho Kettle などの ETL ツールを使用する
于 2013-08-18T10:57:21.103 に答える
5

ステートメントを含むpostgres.sqlファイルでこれと同じエラーが発生しましたが、ファイルはコンマ区切りと引用符ではなくタブ区切りでした。COPY

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

于 2015-08-31T15:02:42.550 に答える
2

これは、ソース csv ファイルを変更しなくても機能するはずです。

alter table people alter column age type text;
copy people from '/tmp/people.csv' with csv;
于 2017-08-24T18:05:04.250 に答える