web-dev-qa-db-ja.com

データ値が欠落しているCSVからのPostgreSQLコピー

COPYを使用してCSVファイルをPostgreSQLにインポートしようとしています。空の値がある行にヒットすると、チョークします。下の2行目:

2001年1月1日、1、2、3、4、5

JAN-02-2001,6,7 、、、

このCOPYステートメントと、NULLおよびQUOTEを使用するバリアントを試しましたが、機能するものは見つかりませんでした。

'data.dat' USING DELIMITERS '、' CSVからデータをコピーします。

助言がありますか?データファイルは22GBの巨大なフラットファイルであるため、直接編集することは避けたいと思います。

20
ugh

インポートの目的で、数値列をテキスト列に変換することをお勧めします。空の文字列は有効な数値ではないためです。数値列をテキスト列に変更し、CSVファイルをインポートし、空の値をnullまたは0に更新してから、列を整数に戻します。

1
Kenaniah

あなたの発言は疑わしいです:

COPY data FROM 'data.dat' USING DELIMITERS ',' CSV;

DELIMITERSはバージョンで使用されていました7.3より前。古いコードを壊さないために引き続きサポートされていますが、これ以上使用しないでください。適切なキーワードはDELIMITERです。また、,のデフォルトであるため、FORMAT CSVを指定する必要はまったくありません。
また、私は ここでは手動 を引用します:

ファイル名

絶対パス名入力ファイルまたは出力ファイル。 Windowsユーザーは、E''文字列を使用し、パス名で使用されている円記号を2倍にする必要がある場合があります。

大胆な強調鉱山。 'data.dat'をUNIXの場合は'/path/to/data.dat'、Windowsの場合はE'C:\\path\\to\\data.dat'のようなものに置き換えます。

バージョン7.3以降の場合:

COPY data FROM '/path/to/data.dat' CSV

バージョン9.0以降の場合:

COPY data FROM '/path/to/data.dat' (FORMAT CSV)

それでもこのエラーが発生する場合:

ERROR: invalid input syntax for type numeric:
CONTEXT: COPY data, line 13, column interval_2400:

次に、明らかに、ソースファイルがテーブルdataの構造と一致しません。ソースファイルを見て、13行目に移動し、列interval_2400にどのような値があるかを確認します。たぶん、それは数値ではありません。特に、数値型の列ではempty string'')は使用できません。

ソースファイルを修正するまたはテーブル定義を適応させるのいずれかを実行できます。

ALTER TABLE data ALTER COLUMN interval_2400 TYPE text;

または、より適切なタイプは何でも。名前から判断すると、intervalである可能性があります。 (ただし、textはほぼ任意の入力値を受け入れます。)

または、さらに良いことに、変更された一時ファイルCOPYを作成し、問題のある値を修正してから、テキストからキャストしてターゲットテーブルに挿入します。見る:

1

もう1つの注意点-エラーの行番号をチェックし、CSVファイルの空白行ではないことを確認してください。これにより、postgresは欠落している値について同じエラーをスローします。

0
glyph

これはPostgreSQLのバグです-csvパーサーは最後の空のアイテムを無視してエラーをスローします-「PG :: BadCopyFileFormat:エラー:列のデータがありません」。

私は愚かなハックを使用しています:

最後の項目が空の場合は、文字列の最後に1つの区切り文字を追加するだけです。

1,2,3
1,2,,

これにより、行の最後の項目を追加してデータをインポートします。

0