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の巨大なフラットファイルであるため、直接編集することは避けたいと思います。
インポートの目的で、数値列をテキスト列に変換することをお勧めします。空の文字列は有効な数値ではないためです。数値列をテキスト列に変更し、CSVファイルをインポートし、空の値をnullまたは0に更新してから、列を整数に戻します。
あなたの発言は疑わしいです:
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つの注意点-エラーの行番号をチェックし、CSVファイルの空白行ではないことを確認してください。これにより、postgresは欠落している値について同じエラーをスローします。
これはPostgreSQLのバグです-csvパーサーは最後の空のアイテムを無視してエラーをスローします-「PG :: BadCopyFileFormat:エラー:列のデータがありません」。
私は愚かなハックを使用しています:
最後の項目が空の場合は、文字列の最後に1つの区切り文字を追加するだけです。
1,2,3
1,2,,
これにより、行の最後の項目を追加してデータをインポートします。