mysql コマンドで select した結果を csv にするやり方をいろいろメモ。
mysql コマンドで select した結果を csv にするやり方をいろいろメモしておく。
mysql コマンドで select した結果を csv にするやり方
mysql コマンドで select すると select の結果はデフォルトで表形式で出力するけど、表形式じゃなくて csv にしたいときとかのやり方をいろいろメモしておく。
この記事ではデータベースは MySQL の サンプルのデータベース の world データベースを使う。
表形式で出力してテキストエディターで編集する (ダメ絶対)
mysql コマンドは select の結果はデフォルトでは表形式で出力するので出力結果をテキストエディターにコピペして CSV に編集していく。
すごく面倒くさい。
mysql> select * from city limit 5; +----+----------------+-------------+---------------+------------+ | ID | Name | CountryCode | District | Population | +----+----------------+-------------+---------------+------------+ | 1 | Kabul | AFG | Kabol | 1780000 | | 2 | Qandahar | AFG | Qandahar | 237500 | | 3 | Herat | AFG | Herat | 186800 | | 4 | Mazar-e-Sharif | AFG | Balkh | 127800 | | 5 | Amsterdam | NLD | Noord-Holland | 731200 | +----+----------------+-------------+---------------+------------+ 5 rows in set (0.00 sec)
mysql コマンドはバッチモードで実行して出力を編集する
mysql コマンドは SQL をパイプで入力するとバッチモードでの動作になる。
mysql コマンドはバッチモードで動作するときは出力結果は表形式じゃなくてカラムをタブ区切りで出力するので、tr コマンドでタブをカンマに置換すると出力結果が CSV になる。
$ echo 'select * from city limit 5' | mysql -h$MYSQL_HOST -u$MYSQL_USER world | tr '\t' ',' ID,Name,CountryCode,District,Population 1,Kabul,AFG,Kabol,1780000 2,Qandahar,AFG,Qandahar,237500 3,Herat,AFG,Herat,186800 4,Mazar-e-Sharif,AFG,Balkh,127800 5,Amsterdam,NLD,Noord-Holland,731200
特定のカラムの出力を CSV にする: tr と sed を使うやり方
テーブルの特定の出力を CSV にするにはこんな感じでやる。
たとえば city
テーブルの ID
カラムを select するとこんな感じに出力するので、
$ echo 'select ID from city order by ID limit 5' | mysql -h$MYSQL_HOST -u$MYSQL_USER world ID 1 2 3 4 5
tr コマンドで改行をカンマに置換する。 末尾に余計なカンマが付いてしまっているので、
$ echo 'select ID from city order by ID limit 5' | mysql -h$MYSQL_HOST -u$MYSQL_USER world | tr '\n' ',' ID,1,2,3,4,5,
sed コマンドで末尾の余計なカンマを除去する。
$ echo 'select ID from city order by ID limit 5' | mysql -h$MYSQL_HOST -u$MYSQL_USER world | tr '\n' ',' | sed ' s/,$//' ID,1,2,3,4,5
特定のカラムの出力を CSV にする: dango を使うやり方
dango コマンドを使うと tr コマンドと sed コマンドを使ってたところが dango コマンド1個に置き換えられる。
自分がやるときはだいたいこれ。
$ echo 'select ID from city order by ID limit 5' | mysql -h$MYSQL_HOST -u$MYSQL_USER world | dango -d ',' ID,1,2,3,4,5