5

ヘッダー付きのタブ区切りファイルの内容をpostgresのテーブルにコピーするためのコピーコマンドに取り組んでいます。以前にコピーを使用したことがあるので、そのしくみは知っていますが、ファイルに欠落しているデータを回避する方法について質問があります。

ヘッダーの値と同じ列名を持つようにテーブルを事前に作成しました。

受け取ったファイルの「列」の一部が空白になっています。コマンドを機能させるためだけに偽のデータを入れましたが、これは毎週自動化される予定です。データが正しいことを確認するよう人々に伝える必要があるのか​​ 、それとも空のデータの代わりにNULLを入力するようにコピーコマンドに指示する方法があるのか​​ どうか疑問に思っていました.

空白のタブに配置する必要があり、それがヌルとして機能する可能性があると考えましたが、それが最善の方法であるかどうかはわかりませんでした.

4

1 に答える 1

5

のドキュメントでCOPYNULLは、 s のデフォルト値が であると指定されています\N。したがって、@a_horse_with_no_name が示唆するように空に変更するのがよい方法です。

もう 1 つの方法は、他のツールを使用してファイルを前処理することです。私はスクリプトで次のことを頻繁に行います。

psql dbname <<EOSQL
COPY tab FROM stdin WITH (FORMAT 'csv', DELIMITER E'\t', NULL 'NULL');
$(printf "1\t2\t3\n4\t\t6\n7\t8\t\n\t10\t11\n"| \
  sed -e 's/\(\t\|^\)\(\t\|$\)/\1NULL\2/g')
\.
EOSQL

代わりにprintf、ファイルを cat できます。必要な操作は何でも使用してください。 注: 私は OSX を使用しているため、sed構文が異なる場合があります。

また、現在の PostgreSQL CommitFest には、汎用のプリプロセッサとポストプロセッサをコマンドに追加するためのパッチがあります。ここでは、ディスカッション全体を見つけることができます。COPY

于 2013-01-28T20:33:36.547 に答える