2017-05-23 18 views
0

私は大量の音楽データを含む大きなファイル(1GB以上)を持っています。このファイルをCOPYコマンドで読みたいと思います。それは一つの大きなテーブルです。トラックがたくさんあります。0x00をNULLとして扱います

しかし、行372032にはジャンルがなく、代わりに0x00文字のトラックがいくつかあります。私が0x00文字がNULLシンボルであることがわかったが、postgresqlはこれを読むのに問題がある。

私が望むのは、postgresqlは0x00をNULLとして扱います。 postgresql documentation for COPYを見て、copyコマンドに、特定の文字列をNULLとして読み取るオプションがあることを確認してください。私はこれを試しましたが、オプション '\ 0x00'(私は '\ x00'、 '0x00'、 'x00'を試しました)を追加することでそれを得ることができませんでした。私はpostgresqlが最初に何かを読むことを望んでいるので、これを置き換えることができると思います。

は、私はこれは私がいくつかの異なるエンコーディングを使用してみました

ERROR: invalid byte sequence for encoding "LATIN1": 0x00 
CONTEXT: COPY music, line 372032 
********** Error ********** 

ERROR: invalid byte sequence for encoding "LATIN1": 0x00 
SQL state: 22021 
Context: COPY music, line 372032 

は(動作しませんでした)、次のエラーメッセージを表示します次のスクリプト

COPY music 
FROM 'mw_spotify_labels.csv' 
WITH DELIMITER ' ' 
NULL '\0x00' 
encoding 'latin1'; 

を走りました。 0x00をスペースで置き換えるFARTも試しましたが、0x00を定義するうまい方法が見つかりませんでした。

誰かがNULLを動作させる方法を知っていますか? "0x00を置き換えるか、このファイルをインポートすることを可能にする他の解決策を設定していますか?

+0

私の知る限り、CSV形式は内部的にNULLをサポートしていないので、0x00文字は間違いなく無効です。私はすべての0x00文字を¥Nまたはまたは他のプレースホルダーに置き換えます。問題は現在、クエリの実行やnullの適切な処理ではありません。PostgreSQLは基本的に、破損したCSVファイルを読み込んで解析することはできません。 –

+0

は、 'psql =#コピーtmp'から '/path/to/file.csv'を区切り文字 '、' csvヘッダーエンコーディング 'windows-1251'などの別のエンコーディングを試してください。 –

答えて

0

0x00がテキストの途中でどこかに表示された場合は、問題のある列のみ'\0x00'(単一引用符を含む)が含まれている場合、あなたは

COPY music 
FROM 'mw_spotify_labels.csv' 
WITH DELIMITER ' ' 
NULL '''\0x00''' 
encoding 'latin1'; 

を使用することができ、あなたはフィルタリングする必要があります何とかです。

関連する問題