LoginSignup
195
208

More than 3 years have passed since last update.

PostgreSQLのCSV出力(Export)方法

Last updated at Posted at 2016-05-26

Export方法(方法は2つある)

[ 環境 ]
psql (PostgreSQL) 9.5.3

COPYコマンド

psqlとコマンドうってpostgres内に入ってからコマンド。

カンマ区切り(CSV)

COPY (テーブル名) TO '(ファイルパス)' WITH CSV DELIMITER ',';
COPY users TO '/tmp/users.csv' WITH CSV DELIMITER ',';

これでカンマ区切りで出力される。いわゆるCSV。

NULL文字を空文字に

COPY (テーブル名) TO '(ファイルパス)' WITH CSV NULL AS '';
COPY users TO '/tmp/users.csv' WITH CSV NULL AS '';

指定しなければ、NULL文字が「\N」という形で出てくる。NULL AS 引用符で、NULL部分を空文字で出力できる。

タブ区切り(TSV)

COPY (テーブル名) TO '(ファイルパス)' WITH CSV DELIMITER E'\t';
COPY users TO '/tmp/users.csv' WITH CSV DELIMITER E'\t';

DELIMITERを「E'\t'」とします。
DELIMITERは1byteオンリーです。なので\tとか入れる2byteなのでエラーが出ちゃう。
なので、その前に大文字Eを付けることで2byteDELIMITERが使えるようになります。

カラム名ほしい

HEADERを付ければOK。

COPY (テーブル名) TO '(ファイルパス)' WITH CSV HEADER;
COPY users TO '/tmp/users.csv' WITH CSV HEADER;

各項目全部を「"(QUOTE)」で囲みたい

フォースを使うんじゃ!

COPY (テーブル名) TO '(ファイルパス)' WITH CSV FORCE QUOTE *;
COPY users TO '/tmp/users.csv' WITH CSV FORCE QUOTE *;

エクセルでCSV加工したい人!!!

つまりは
* タブ区切りで、
* 引用符(QUOTE)で囲んで、
* NULL文字は空文字化したい
* カラム名も表示

フォースを使うん(ry

COPY (テーブル名) TO '(ファイルパス)' WITH CSV DELIMITER E'\t' FORCE QUOTE * NULL AS '' HEADER;
COPY users TO '/tmp/users.csv' WITH CSV DELIMITER E'\t' FORCE QUOTE * NULL AS '' HEADER;

後は文字コードがSJISになってれば完璧ですね!!
(UTF-8とかで出力してきたらiconvコマンドとかでSJIS化するだけです)

※export先予定のファイルが既に存在するときには上書きされます。

psqlコマンド

こっちはpsqlで入る前。シェル状態で使う。

カンマ区切り(CSV) & NULL文字を空文字に

psql データベース名 -c "SQL文" -A -F, > CSVファイル名

こっちでもいい。
-Fは、フォーマットオプションでデフォルトは「,(カンマ)」。

タブ区切り(TSV)

psql データベース名 -c "SQL文" -A -F $'\t' > CSVファイル名

タブ区切り(tsv)ならタブであることを明記。

※export先予定のファイルが既に存在するときにはエラーが出ます(ファイルあるよ!)。
その他は割愛します!

Import方法は?

COPY (テーブル名) FROM '(ファイルパス)' DELIMITER E'\t' WITH NULL AS '';

TOをFROMにするとインポートできる。

195
208
1

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
195
208