1
2

More than 3 years have passed since last update.

【初心者向け】10行以内のスクリプト(7.bashでsqlite3のテーブルからcsvを出力するスクリプト

Posted at

【初心者向け】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>

スクリプトは、ターミナルから実行しました。

bash,sqlite3

#!/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件を検索してみました。

sqlite3

select 
* 
from t_dexjpus 
        where dexjpus is not '.'        
        order by dexjpus asc 
        limit 10; 

降順で10件検索の別のファイルも読んでみました。

sqlite3

select 
* 
from t_dexjpus 
        order by dexjpus desc 
        limit 10; 

実行した結果

bash

$ 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を出力するスクリプトでした。

1
2
0

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
1
2