web-dev-qa-db-ja.com

CSV形式のPostgresCOPYコマンドで見積もり処理をオフにすることはできますか?

CSVファイル、タブ区切り、フィールドnotを引用符で囲んでいます。フィールドデータには、一重引用符、二重引用符、パイプ、円記号などの文字を含めることができます。

サンプルデータは次のようになります。

_1       2       "ba$aR\eR\       18
_

COPYステートメントを使用してこのデータをPostgresにインポートしたいと思います。

これを使用してインポートしようとすると

_COPY <tablename> FROM  <filename> NULL AS '';
_

Postgresがバックスラッシュ+タブをバックスラッシュの後にフィールド区切り文字ではなく「エスケープされたタブ」として扱っているため、エラー_psql:-:1: ERROR: missing data for column_が発生します。

そこで、次のように、COPY演算子の「CSV形式」を使用するように切り替えました。

_COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' NULL AS '';
_

今、新しいエラーがありますpsql:-:1: ERROR: value too long for type character varying(254)

どうやら、フィールド3の先頭にある二重引用符をフィールドの折り返し文字として解釈しているためです。

データが[〜#〜]引用されていない[〜#〜]であることを指定するにはどうすればよいですか?

18
Tom De Leu

回避策(ありがとう このコメント !)

COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS '';

したがって、基本的に、テキストに含めるべきではない引用文字を指定しますが、それはかなり醜いです。

実際に見積もり処理を完全にオフにする方法があれば、私はそれを大いに好むでしょう。

26
Tom De Leu

(まだコメントする評判がないので、新しい回答として追加しました。)

ちなみに、私は同じ問題に苦しんでいるので、期待ではなく、trを使用して\bを削除できます。どこでもあなたのテキストで。

tr -d '\010' < filename.csv > newfile.csv

(その\010を使用すると、\bの-​​ 8進表現 になります)。

COPYSTDINからの読み取りをサポートしているため、trの出力をパイプ処理することでI/Oの影響を緩和できます。

cat filename.csv | tr -d '\010' | COPY <tablename> FROM STDIN WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS '';
1
Kyle Barron

説明どおりにフォーマットされたデータに使用するモードは、デフォルトのテキストモードです。ほとんどの文字が妨げられることなくデータベースに渡されます。引用符処理はなく、区切り文字としてタブを使用しています。 CSVモードを使用すると、回避する必要のある見積もりを導入するため、問題が発生します。

テキストモードでは、ドル文字、一重引用符と二重引用符、パイプ、さらにはバックも渡されますスペース(質問では言及されていませんが)。例で渡されないのは、バックスラッシュ。しかし、それは、たとえば次のsedコマンドによって、それらをエスケープするのと同じくらい簡単です。

sed -e 's/\\/\\\\/g' < source.txt > processed.txt

次に、処理されたファイルは、追加のオプションなしでインポート可能である必要があります。

\copy sometable from processed.txt
1
nitro2k01