0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エスケープシーケンスにハマった

Posted at

エスケープシーケンスにハマった

PostgreSQLのCOPYを使用してテーブルをCSV出力する際ヘッダーとレコードを二重引用符""で囲みたかった。
質問に希望の回答は帰ってこず自分で試行錯誤した結果と心情をまとめる。

PostgreSQLのCOPY

まず、ヘッダーの出力とレコードを""で囲っていく。

COPY sample_table TO 'C:/tmp/test1.csv' WITH csv header force quote *;

csv形式で headerを含め force quote *で全カラムの非NULL値も強制的に""で囲む。

test1.csv
no,name,sex_cd
"1","藍沢","1"
"2","石田","0"
"3","及川","0"

ここからは試行錯誤

ヘッダーを任意の名前で出力しよう

COPY (SELECT no as "番号",name as "名前",sex_cd as "性別" FROM sample_table) 
    TO 'C:/tmp/test2.csv' WITH csv header force quote *;
test2.csv
番号,名前,性別
"1","藍沢","1"
"2","石田","0"
"3","及川","0"

よし、このまま""を文字列に入れて完璧やな

文字列認識させるためにエスケープしてと

エスケープ方法をDocumentより

引用符付き識別子は、コード0の文字以外であればどのような文字でも使えます (二重引用符を含めたい場合は、二重引用符を2つ入力します)。 これにより、空白やアンパサンド(&)を含むテーブル名や列名など、この方法がなければ作れないような名前のものを作ることが可能になります。 この場合においても長さの制限は適用されます。

COPY (SELECT no as """番号""",name as """名前""",sex_cd as """性別""" FROM sample_table) 
    TO 'C:/tmp/test3.csv' WITH csv header force quote *;
test3.csv
"""番号""","""名前""","""性別"""
"1","藍沢","1"
"2","石田","0"
"3","及川","0"

???なんで???
エスケープできてないのか?SELECT文だけ確認

SELECT no as """番号""",name as """名前""",sex_cd as """性別""" FROM sample_table;
"番号" "名前" "性別"
1 藍沢 1
2 石田 0
3 及川 0

できてるなぁ

その他のオプションを変更して入力した"""番号"""がそのまま表示されたわけじゃないことを確認していく。
quoteをデフォルトの"から変更

COPY (SELECT no as """番号""",name as """名前""",sex_cd as """性別""" FROM sample_table) 
    TO 'C:/tmp/test4.csv' WITH csv header force quote * quote '?';
test4.csv
"番号","名前","性別"
?1?,?藍沢?,?1?
?2?,?石田?,?0?
?3?,?及川?,?0?

escapeをデフォルトの"から変更

COPY (SELECT no as """番号""",name as """名前""",sex_cd as """性別""" FROM sample_table) 
    TO 'C:/tmp/test5.csv' WITH csv header force quote * escape '?';
test5.csv
"?"番号?"","?"名前?"","?"性別?""
"1","藍沢","1"
"2","石田","0"
"3","及川","0"

なるほど。
カラム名の文字としての"quote"区別できないからescape"を文字の"の前につけるよーってことか。
だからquote?にしたときはヘッダーを二重引用符で囲めたのね。

結果

ヘッダーを取るとレコードが、レコードを取るとヘッダーがって
今の自分にはこれ以上COPY文でどうにもなりそうにないので別の方法しかないのかなぁ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?