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の先頭にある二重引用符をフィールドの折り返し文字として解釈しているためです。
データが[〜#〜]引用されていない[〜#〜]であることを指定するにはどうすればよいですか?
回避策(ありがとう このコメント !)
COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS '';
したがって、基本的に、テキストに含めるべきではない引用文字を指定しますが、それはかなり醜いです。
実際に見積もり処理を完全にオフにする方法があれば、私はそれを大いに好むでしょう。
(まだコメントする評判がないので、新しい回答として追加しました。)
ちなみに、私は同じ問題に苦しんでいるので、期待ではなく、tr
を使用して\b
を削除できます。どこでもあなたのテキストで。
tr -d '\010' < filename.csv > newfile.csv
(その\010
を使用すると、\b
の- 8進表現 になります)。
COPY
はSTDIN
からの読み取りをサポートしているため、tr
の出力をパイプ処理することでI/Oの影響を緩和できます。
cat filename.csv | tr -d '\010' | COPY <tablename> FROM STDIN WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS '';
説明どおりにフォーマットされたデータに使用するモードは、デフォルトのテキストモードです。ほとんどの文字が妨げられることなくデータベースに渡されます。引用符処理はなく、区切り文字としてタブを使用しています。 CSVモードを使用すると、回避する必要のある見積もりを導入するため、問題が発生します。
テキストモードでは、ドル文字、一重引用符と二重引用符、パイプ、さらにはバックも渡されますスペース(質問では言及されていませんが)。例で渡されないのは、バックスラッシュ。しかし、それは、たとえば次のsed
コマンドによって、それらをエスケープするのと同じくらい簡単です。
sed -e 's/\\/\\\\/g' < source.txt > processed.txt
次に、処理されたファイルは、追加のオプションなしでインポート可能である必要があります。
\copy sometable from processed.txt