MySQLのデータをcsv,tsv形式で出力する

調査のためにMySQLのテーブルのデータをCSVファイルで取り出すことになりました。方法をまとめます。

mysqldump

MySQLにはmysqldumpというツールがあり、下記のようなコマンドでDBの情報をダンプ(出力)できます。

mysqldump -u {USERNAME} -p {DB} {TABLE} > {OUTPUT_FILE_NAME}

tsv形式でダンプする場合は --tab オプションをつけます。

mysqldump -u {USER_NAME} -p --tab=/tmp {DB_NAME} {TABLE_NAM}

--tab=/tmp と指定することで、/tmpディレクトリ配下にファイルを出力することができます。

csv形式でダンプする場合は–tabオプションに加えて、–fields-terminated-by=,を指定します。

mysqldump -u {USER_NAME} -p --tab=/tmp --fields-terminated-by=, {DB_NAME} {TABLE_NAM}

mysqldump以外の方法でcsv出力

mysqldumpを使った方法は接続元のサーバーとmysqlサーバーが同じ場所で動作している必要があります。AWSなどの踏み台経由でRDSと接続している場合などは実行できません。

The trouble with all these INTO OUTFILE or --tab=tmpfile (and -T/path/to/directory) answers is that it requires running mysqldump on the same server as the MySQL server, and having those access rights.

https://stackoverflow.com/questions/12040816/dump-all-tables-in-csv-format-using-mysqldump

別の策として、SQL文を実行してその結果をリダイレクトするという方法があります。

mysql -B -u {USERNAME} -p {PASSWORD} {DB} -h {DB_HOST} -e "SELECT * FROM accounts;" \ | sed "s/\"/\"\"/g;s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > hogehoge.csv

sed コマンドで不要な文字列を置換し、csvファイルとして出力できます。

まとめ

MySQLのデータをいい感じにcsvファイルに出力できました。やったね!