1. ホーム
  2. postgresql

[解決済み】PG COPY エラー: 整数の入力構文が無効です

2022-02-23 16:12:07

質問

実行中 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

解決方法は?

<ブロッククオート

ERROR: 整数に対する無効な入力構文: ""。

"" は有効な整数ではありません。PostgreSQLは 引用されない の空白フィールドは、CSVではデフォルトでNULLとして扱われますが "" と書くようなものでしょう。

SELECT ''::integer;

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

もし、NULL整数を引用符で囲んだ空文字列のようなCSVを扱いたい場合、それを少し整理することができるプリプロセッサを介してPostgreSQLに渡す必要があります。PostgreSQLのCSV入力は、CSVの奇妙で素晴らしい乱用の可能性を全て理解できるわけではありません。

オプションは以下の通りです。

  • 表計算ソフトで読み込んで、まともなCSVを書き出す。
  • Pythonを使用する csv モジュール、Perl Text::CSV などで前処理をする。
  • Perl/Python/whateverを使用してCSVをロードし、DBに直接挿入します。
  • CloverETL、Talend Studio、Pentaho KettleなどのETLツールの使用