エスケープシーケンスにハマった
PostgreSQLのCOPYを使用してテーブルをCSV出力する際ヘッダーとレコードを二重引用符""
で囲みたかった。
質問に希望の回答は帰ってこず自分で試行錯誤した結果と心情をまとめる。
PostgreSQLのCOPY
まず、ヘッダーの出力とレコードを""
で囲っていく。
COPY sample_table TO 'C:/tmp/test1.csv' WITH csv header force quote *;
csv
形式で header
を含め force quote *
で全カラムの非NULL値も強制的に""
で囲む。
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 *;
番号,名前,性別
"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 *;
"""番号""","""名前""","""性別"""
"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 '?';
"番号","名前","性別"
?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 '?';
"?"番号?"","?"名前?"","?"性別?""
"1","藍沢","1"
"2","石田","0"
"3","及川","0"
なるほど。
カラム名の文字としての"
とquote
の"
区別できないからescape
の"
を文字の"
の前につけるよーってことか。
だからquote
を?
にしたときはヘッダーを二重引用符で囲めたのね。
結果
ヘッダーを取るとレコードが、レコードを取るとヘッダーがって
今の自分にはこれ以上COPY文でどうにもなりそうにないので別の方法しかないのかなぁ。