web-dev-qa-db-ja.com

COPYを使用した日付のインポートに失敗しました

私はCSVファイルをPostgresのテーブルにインポートしようとしています、そしてそれは最初の日付フィールドで爆撃しています。日付の形式はdd/mm/yyyyで、CSVの問題のフィールドに日付がありません。

そのため、私は以下を使用しています:

set datestyle = 'ISO,DMY'; 

\copy companies_house_snapshot 
FROM 'BasicCompanyDataAsOneFile-2017-04-01.csv' 
WITH DELIMITER ',' CSV HEADER NULL AS '';

私はこれで十分だと思いましたが、エラーメッセージは次のとおりです。

エラー:タイプ日付の無効な入力構文: "" 
コンテキスト:コピーcompanies_house_snapshot、2行目、列溶解_日付: "" 

ここで、dissolution_dateはnull可能で、CSVでは""として

Ubuntu 16.04でPostgreSQL 9.5.6を使用しています

どこがいけないの?

'""'NULLとして使用すると、次のようになります。

エラー:CSV引用文字をNULL仕様に含めることはできません
1
SWa

'""'をNULLとして使用すると、次のようになります。

私はいつもこれらの問題を抱えています。 PostgreSQLは2つのモードを持つことにより、UIの観点から本当に大規模で愚かな間違いを犯しました

  1. CSV
  2. 非CSV

それらによるCSVは RFC418 です。ただし、他の誰も従わない場合は仕様に準拠することはそれほど有用ではなく、RFC4180はおそらくインターネットで最も使用頻度の低い仕様です。 それを人々に使い始めます。

とにかく、これらの問題を解決する簡単な方法は、テストテーブルを作成することです...

CREATE TABLE foo ( x int, y int, z int );
INSERT INTO foo (x,y,z) VALUES (1,null,2);

そして、両方のモードのブルートフォースオプションを動作させるようにします。とにかく直感的ではないので、とにかくやっていました。しかし、それはかなり迅速です。

COPY foo TO STDOUT NULL AS '""' DELIMITER ',';

それはあなたが望むことをするようです。同じオプションでそれを読むことができるはずです。

COPY foo FROM '/tmp/test.csv' NULL AS '""' DELIMITER ',';
2
Evan Carroll