【初心者向け】10行以内のスクリプト(7.bashでsqlite3のテーブルからcsvを出力するスクリプト)
pythonで色々なライブラリを使えば、「少ないコードでもちょっとした事が出来て、少なければ5行程でもちょっとしたスクリプトが作れ、便利だな。」と思ったので、pythonやその他、コマンドを羅列しただけのものも出てくるかも知れませんが、10行程のスクリプトを不定期で投稿してみようと思います。
第7回として、bashでsqlite3のテーブルからcsvを出力するスクリプトを投稿したいと思います。
少し古いデータですが、ダウンロードしてあったfredの為替相場のcsvを格納したsqlite3から、select文を発行してカンマ区切りで表示してみようと思います。
1.sqlite3のテーブルからcsvを出力するスクリプト
【環境】
Linux: debian10
sqlite3: version 3.27.2
bash: 5.0.3
sqlite3で、カンマ区切りで出力する方法は、「sqlite3のコマンドとして.mode csv」他に、「-separator」というオプションで、区切り文字を指定出来る様です。
とすると、以下の様な構文になると思うのですが、色々と試してみたところ、
【2】の外部ファイルをパイプでsqlite3に渡すやりかたが良い様に思いました。
【1】sqlite3 (-separator ,) sqliteファイル名.sqlite3 "sql文、若しくはコマンド"
【2】echo '.read 「sqlを記述した外部ファイル」' | sqlite3 -separator , 「データベースのファイル名」
sqlを記述したファイルを読んで抽出するのですが、殆どがコメントです。
データベースの定義や複数行でインデントした外部のsql文を除けば、sqllite3の操作は一行というシンプルさです。
抽出結果を保存する場合は、リダイレクトするだけです。
データ・ベースに相当するsqliteのファイルは、カレントディレクトリに「dexjpus.sqlite3」としました。
以下の様に、日付と相場の2つのカラムからなる、時系列データです。
sqlite> .schema
CREATE TABLE t_dexjpus(
"DATE" TEXT,
"dexjpus" TEXT
);
sqlite>
スクリプトは、ターミナルから実行しました。
#!/usr/bin/env bash
#####################################
# sqlite3のテーブルからcsvを出力するスクリプト
# sqlite3: version 3.27.2
# bash: 5.0.3
# sqlite3:ファイル名: dexjpus.sqlite3
# sql記述ファイル: select_tbl.sql
# sqlite3 (-separator ,) sqliteファイル名.sqlite3 "sql文、若しくはコマンド"
# csv出力: -separator ,
# #
#####################################
# ファイル名
db_file=dexjpus.sqlite3
#echo '.read select_tbl.sql' | sqlite3 -separator , dexjpus.sqlite3
# echoでsqliteのコマンド「.read」でsqlを記述した外部ファイルを読む
# パイプでsqlite3にフィールセパレーターに「,」を指定
# データが格納されたファイルを開く
echo '昇順で10件'
echo '.read select_tbl_asc.sql' | sqlite3 -separator , $db_file
echo ''
echo '降順で10件'
echo '.read select_tbl_desc.sql' | sqlite3 -separator , $db_file
2.sql文の読み込みを見てみると
外部ファイルは、一行で記述しても良いのですが、一応、改行をしながら記述しています。
「echo '.read select_tbl_asc.sql' | sqlite3 -separator , $db_file」として、
以下のsql文を読み込みました。
このデータは取引が無い日の相場は、ピリオドが入っている様です。
それ以外で、昇順で10件を検索してみました。
select
*
from t_dexjpus
where dexjpus is not '.'
order by dexjpus asc
limit 10;
降順で10件検索の別のファイルも読んでみました。
select
*
from t_dexjpus
order by dexjpus desc
limit 10;
実行した結果
$ sh sqlite3_rev_csv.sh > out.txt
$ less out.txt
昇順で10件
2016-08-18,100.0700
2016-08-23,100.2000
2016-08-17,100.2400
2016-08-19,100.2400
2016-08-22,100.2500
2016-08-16,100.2800
2016-09-26,100.3400
2016-09-27,100.3600
2016-08-24,100.5000
2016-09-28,100.5700
降順で10件
2015-06-05,125.5800
2015-06-08,125.0800
2015-08-11,124.9000
2015-08-05,124.8400
2015-06-01,124.6400
2015-08-06,124.6000
2015-06-04,124.5600
2015-08-10,124.5500
2015-08-18,124.3900
2015-07-30,124.3800
sqliteの「.read」を使って、外部にsql文を記述する事で、再利用がしやすく、また複雑なsql文に対応出来そうです。
sqlite3は、shellの他、python等の言語からも接続しやすく、またファイルベースで手軽に使え、機能も豊富になっている模様。
スマートデバイスや今後のIoTの普及を視野に入れると今後、益々重要なものになりそうに思います。
以上、7.bashでsqlite3のテーブルからcsvを出力するスクリプトでした。