昨日の応用編で、実行環境は同じCygwin 2.5.1 x64 + putclip + Cygwin版psql。Excelは2007でテストしました。PostgreSQLのデータを、ファイルを経由せずExcelに持っていく方法としては、今日のが個人的ベストな予感。
コマンドはわずか ↓ これだけ。1行目で出力形式を「ヘッダ(列名)ありのタブ区切り」に設定。2行目が任意のクエリ + \g | putclipで、クエリ結果を直接クリップボードへ突っ込みます。ASCII以外のデータがある場合、最後の行のように文字コード変換が必要。もちろんiconv以外のコマンドラインツールでもOK。
\t off \\ \f '\t' \\ \pset format unaligned
( ... your query ... ) \g | putclip
-- DB: utf8 -> Excel: sjis
( ... your query ... ) \g | iconv -f utf8 -t sjis | putclip
昨日もやったけど、\g以降を好きな変数名で保存すれば実行がもっと楽に。エイリアスみたいなものです。
\set vname '\\g | iconv -f utf8 -t sjis | putclip'
( ... your query ...) :vname
↓ 実際の様子。1行目を打つとレスポンスが3行あります。3つの出力設定をまとめて実行してるから(\\で連結)。データのみ必要なら、最初を「\t on」にして下さい。続いてクエリ+メタコマンドを打ってもレスがないので不安になりますが、クリップボードにきちんと格納されており、Excelに移って好きな場所で貼り付けできます。
# \t off \\ \f '\t' \\ \pset format unaligned
Tuples only is off.
Field separator is " ".
Output format is unaligned.
# select * from pg_tables \g | putclip
同じクエリ結果を、クリップボードでなく普通に表示すると ↓ こんな感じ。列間のタブ区切りが、Excelではセル間の区切りになります。
# select * from pg_tables;
schemaname tablename tableowner tablespace hasindexes
pg_catalog pg_statistic postgres t f f
pg_catalog pg_type postgres t f f f
pg_catalog pg_authid postgres pg_global t f
pg_catalog pg_user_mapping postgres t f f
pg_catalog pg_largeobject postgres t f f
pg_catalog pg_attribute postgres t f f
pg_catalog pg_proc postgres t f f f
pg_catalog pg_class postgres t f f
...
日本語のクエリ結果で、うっかり文字コード変換を忘れると ↓ 文字化けします。2つ目のクエリ・画像が文字コード変換した正常バージョン。
# select chr(12354 + i) from generate_series(1, 50) as i
\g | putclip
# select chr(12354 + i) from generate_series(1, 50) as i
\g | iconv -f utf8 -t sjis | putclip
↓ 少し違う方法で、\copyコマンドの出力先をクリップボードにしても同じことが可能。文字コード指定は不要な一方(自動変換されるぽい)、メタコマンドなので改行を入れられず、\copyのオプションを毎回書く必要があるので実用性は下です。
# \copy (select chr(12354 + i) from generate_series(1, 50) as i) to '/dev/clipboard' (format csv, delimiter e'\t', header true, null '')
COPY 50
同じ\copyからクリップボードで、出力文字コードをSJISに指定すると ↓ 文字化けというよりバイトシーケンスがバラバラで認識された感じでした。
# \copy (select chr(12354 + i) from generate_series(1, 50) as i) to '/dev/clipboard' (encoding sjis, format csv, delimiter e'\t', header true, null '')
COPY 50
\copyコマンドはデフォルトでNULLを\Nで明示します。オプションで空白を指定しないと ↓ こんな感じになって直すのに一手間。だから、繰り返しになりますが最初のパターン「出力形式を指定、続いてクエリ+メタコマンド」が使いやすいです。
# \copy (select * from pg_tables) to '/dev/clipboard';
COPY 61