データベースに接続してCSVファイルを取得したいことが度々あるのですが、その度にやり方を忘れてしまっているのでここにメモします。
MySQLの場合は、SELECT 文に "INTO OUTFILE" を記述することで CSV ファイルを出力することができます。
CSV出力の構文
デフォルト
SELECT {{カラム名}} FROM {{テーブル名}} INTO OUTFILE {{出力ファイルパス}};
オプション指定
オプションを付けること区切り文字や改行コードを指定することができます。
SELECT {{カラム名}} FROM {{テーブル名}} INTO OUTFILE {{出力ファイルパス}}; FIELDS TERMINATED BY '{{区切り文字}}' ENCLOSED BY '{{フィールドを囲む文字}}' LINES TERMINATED BY '{{改行コード}}';
オプションの補足
FIELDS
TERMINATED BY
- 区切り文字を指定
- デフォルトではタブ区切り
ENCLOSED BY
- フィールドを囲む文字の指定
- デフォルトは囲み文字なし
LINES
TERMINATED BY
- 改行コードを指定
- デフォルトはLF(\n)
おまけ
文字コード指定
文字コードを指定する場合は" INTO OUTFILE "の後に "CHARACTER SET" という句を追加します。
SELECT {{カラム名}} FROM {{テーブル名}} INTO OUTFILE {{出力ファイルパス}} CHARACTER SET '{{文字コード}}';
mysqldump で csv 出力
mysqldump というコマンドを使って CSV を出力します。
CSV 形式でダンプする場合は –tab オプションに加えて、 –fields-terminated-by= を指定します。
$ mysqldump -u{{ユーザ名}} -p --tab=/tmp --fields-terminated-by=, {{DB名}} {{テーブル名(省略可能)}} Enter password:パスワードを入力
sed コマンドを使って csv 出力
SQL 文を実行してその結果をリダイレクトして sed で処理させる方法です。
$ mysql -B -u {{ユーザ名}} -p {{パスワード}} {{DB名}}-h {DB_HOST} -e "SELECT * FROM {{テーブル名}};" \ | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > {{CSVファイル名}}