2013-12-05 21 views
7

私はCSVファイルをタブ区切りにして、ではなく、を引用符で囲んでいます。フィールドデータには、一重引用符、二重引用符、パイプ、バックスラッシュなどの文字を入れることができます。Postgres COPYコマンドの引用処理をCSV形式でオフにすることはできますか?

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

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の。

私のデータがではないことをどのように指定することができますか?は全く引用されていますか?

+1

はなぜ答えとしてあなたの回避策を投稿しませんか? –

+1

チップをありがとう、やった! –

+0

[CSVファイルをPostgreSQLにインポートする際に、引用符を無視しますか?](http://stackoverflow.com/questions/7376322/ignore-quotions-marks-when-importing-a-csv-file-into-postgresql) –

答えて

18

回避策(this commentに感謝!)

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

だから、基本的にテキストではいけません引用符文字を指定して、それはかなり醜いです。

実際に引用処理を完全に無効にする方法があれば、私はそれを好むでしょう。

0

は(私がコメントするにはまだ評判を持っていないので、新しい答えとして追加されました。)

を記録するために、私は同じ問題で苦労してきたことから、あなたは\bを削除するためにtrを使用することができ、ただの代わりにあなたのテキストのどこにもない。

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

\010\boctal representationであることを使用)。

COPYSTDINから読んでサポートしているので、あなたは、配管によってI/Oへの影響を緩和することができますtrの出力:

cat filename.csv | tr -d '\010' | COPY <tablename> FROM STDIN WITH CSV DELIMITER E'\t' QUOTE E'\b' NULL AS ''; 
関連する問題