CSVデータに対してSQLのwhere、order by、group by、joinができる `q` コマンド(導入編)

2019-02-20Bash, CentOS, Cygwin, Linux, Ubuntu

※セットアップに意外とハマってしまい、今回は導入まで。使い方に触れるのは次回。

はじめに

年度末が近づいてきて、仕事でもCSVデータをこねくり回す機会が増えてきた。
(ログデータ集計、デバッグだけでなく、確定申告の金額計算など)

CUI好きの自分も grep / sed / sort / uniq / join / paste のコマンドを毎回毎回パイプラインでつないでいるのは多少面倒になる。

CSVデータをSQLで操作できればいいのに、と思う人も少なくないはず。
僕もSQLでデータ操作するほうがなれている。

そんな方におすすめなのが、 qコマンド 。名前のせいで ググラビリティ が低いのが難点だがとっても便利。

検証環境

$ uname -moi
x86_64 MacBookPro10,1 Darwin

$ bash -version
GNU bash, バージョン 5.0.2(1)-release (x86_64-apple-darwin18.2.0)
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

$ python --version
Python 3.7.2

インストール方法

Github の以下のページを参照。OSごとにインストール方法が記載されている。

Linux系OSで最も簡単なのは、スクリプトをダウンロードしてくる方法。
Cygwin 上でもう動く。
ただしこの場合は python2.5 以上が必要。

# **僕はこの方法が好き**

# srcディレクトリに最新コードを配置
$ cd /usr/local/src/
$ git clone https://github.com/harelba/q.git

# binディレクトリにシンボリックリンクだけを貼る
$ cd /usr/local/bin
$ ln -s /usr/local/src/q/bin/q

使ってみる

テストデータ

テストデータを用意。以下のページのcsvデータを借用。

先頭の数行を出力。

$ head mb010000.csv
28N,lԒ,,
㊪@o@@SDP\@Nʂɂ݂oEiljEoyэvo

@FPjaPX`QPN͎ŝߏȗBaQQ`SVN͉ꌧ܂ȂB
@@@QjaNETNEPON̏ȏɂ́AjsڂeP܂܂B
@@@RjZoɗpl͓{llłB
FЉElulvWvAJȁulԓvv
, o,,, o, o@,v
, @,@ j,@ ,, @,o
1899,1386981,713442,673539,32.0,105.9,@@@...

改行コードが CRLF で文字コードが CP932 のcsvファイルだと。
変換しておく。

$ cat mb010000.csv | sed "s/\r//g" | iconv -f cp932 -t utf8 > mb010000-utf8.csv

公共のcsvってこんなものなのかな。上部の行によくわからないものがたくさん入ってる。

$ head mb010000-utf8.csv
平成28年,人口動態調査,,
上巻 出生  第4.1表 年次別にみた出生数・率(人口千対)・出生性比及び合計特殊出生率

注 :1)昭和19〜21年は資料不備のため省略した。昭和22〜47年は沖縄県を含まない。
   2)昭和元年・5年・10年の出生数の総数には、男女不詳が各1が含まれている。
   3)率算出に用いた分母人口は日本人人口である。
資料:国立社会保障・人口問題研究所「人口統計資料集」、厚生労働省「人口動態統計」
, 出生数,,, 出生率, 出 生,合計特殊
, 総 数,  男,  女,, 性 比,出 生 率
1899,1386981,713442,673539,32.0,105.9,   ...

1行目〜9行目は削除しておく。

# 先程のコマンドに末尾にsedを追加
$ cat mb010000.csv | sed "s/\r//g" | iconv -f cp932 -t utf8 | sed '1,9d' > mb010000-utf8.csv

$ head mb010000-utf8.csv
1899,1386981,713442,673539,32.0,105.9,   ...
1900,1420534,727916,692618,32.4,105.1,   ...
1901,1501591,769494,732097,33.9,105.1,   ...
1902,1510835,773296,737539,33.6,104.8,   ...
1903,1489816,763806,726010,32.7,105.2,   ...
1904,1440371,738230,702141,31.2,105.1,   ...
1905,1452770,735948,716822,31.2,102.7,   ...
1906,1394295,726155,668140,29.6,108.7,   ...
1907,1614472,818114,796358,34.0,102.7,   ...
1908,1662815,850209,812606,34.7,104.6,   ...

普通にデータ閲覧

早速SQLを使ってデータを操作してみる。

  • -d オプションに区切り文字を指定。
    • 今回はカンマ( , )を指定。
  • from 句にはcsvファイル名を指定
# これで動く。。。はず。
$ q -d , "select * from mb010000-utf8.csv"

これですぐに動作する想定だったが、今回若干ハマる。
以下のようなエラーが発生。

$ q -d , "select * from mb010000-utf8.csv"
  File "/usr/local/bin/q", line 139
    except ImportError, e:

どうやら python3系だと一手間加えないと動作しない模様。 ソースコードのブランチを切り替える。

$ cd /usr/local/src/

$ git checkout python3

再実行。

$ q -d , "select * from mb010000-utf8.csv"
1899,1386981,713442,673539,32.0,105.9,   ...
1900,1420534,727916,692618,32.4,105.1,   ...
1901,1501591,769494,732097,33.9,105.1,   ...
1902,1510835,773296,737539,33.6,104.8,   ...
1903,1489816,763806,726010,32.7,105.2,   ...
1904,1440371,738230,702141,31.2,105.1,   ...
1905,1452770,735948,716822,31.2,102.7,   ...
1906,1394295,726155,668140,29.6,108.7,   ...
1907,1614472,818114,796358,34.0,102.7,   ...
1908,1662815,850209,812606,34.7,104.6,   ...
1909,1693850,863855,829995,34.9,104.1,   ...
1910,1712857,872779,840078,34.8,103.9,   ...
1911,1747803,891049,856754,35.1,104.0,   ...
1912,1737674,886449,851225,34.4,104.1,   ...
1913,1757441,897824,859617,34.3,104.4,   ...
...

ひとこと

セットアップにハマってしまった。。。
最近 python3 系にアップグレードしたのと、 q 使っていなかったのでハマってしまった。。。

2019-02-20Bash, CentOS, Cygwin, Linux, Ubuntu