csvqを使ってVimの中で簡易SQLを使えるようにしてみた

はじめに

こんにちは、平野です。

データベースに入っていないcsvデータに対して手元でSQLを実行するアプリとしてcsvqがあります。 小さなデータでの確認など色々と重宝しています。 今回はこれをVimのバッファにあるデータに対して実行することでちょっとだけラクできるようなプラグインを作ってみました。

なお、今回は複数テーブルのことは一切忘れております。 csvq自体は複数テーブルにも対応しているので、いずれ対応できればとも思いますが、 まずは単一テーブルの操作に限定しています。

使い方

実行前

Vimで以下のように、クエリとデータを用意します。 (実際に実行する場合は#以降の文章を削除してください)

-- -d '\t'                        # 先頭の"-- "の後にcsvqのオプションを書く
select * where colA = 'reiwa'     # SQL文を書く。fromは書かない

;------------                     # 最後の";"の次の行以降をデータとみなす
colA    colB    colC
heisei  31  2019-04-30
reiwa   1   2019-05-01

この状態で、クエリが書いてある行でF8 (後述のように、好きにキーバインドを設定してください)を押すとクエリが実行されます。

SQLで注意するべき点としては、fromが不要となっています。 csvqではfromが省略された時には標準入力がデータの入力となるので、それを利用しています。 普段SQLを書き慣れている人には逆に違和感があるかもしれませんがご了承ください。

ファイル先頭には-- (CSVのオプション文字列)を書くことができるので適宜設定してください。 今回はデータがタブ区切りになっているので、csvqのオプションとして-d '\t'を指定しています。

なお、SQL文を書く部分とデータの部分とを別のウィンドウにしたいという気持ちもあったのですが、 簡単にすぐできる方法ということで、同一ウィンドウ内で処理するようにしてしまいました。 しかし使ってみると、単純に一つのテキストファイルとして保存できるなどのメリットがあり、 この形態が一番よかったように思います。

実行後

データの部分がcsvqによって処理された文字列に置き換えられます。 データよりも上の部分はそのまま残ります。

-- -d '\t'                        # 先頭の"-- "の後にcsvqのオプションを書く
select * where colA = 'reiwa'     # SQL文を書く。fromは書かない

;------------                     # 最後の";"の次の行以降をデータとみなす
+--------+------+------------+
|  colA  | colB |    colC    |
+--------+------+------------+
| reiwa  | 1    | 2019-05-01 |
+--------+------+------------+

処理自体はcsvqに丸投げしているだけなので、もちろんもっと複雑なこともできます。

便利なポイント

  • Undo
    • csvqを使った処理はVim的には1回の変更として扱われるため、uで処理前に戻すことができます。
  • 出力を次の入力に
    • csvqのオプションで-f TSVを指定すれば処理結果がtsvになるので、続けて別のクエリの実行が可能に。

インストール

csvq

まずはcsvqがPATHが通っている場所に配置され、csvqだけで起動するようになっている必要があります。

csvqのインストールに関しては下記ブログをご参照ください。 私もこの記事でcsvqの存在を知りました!ご紹介ありがとうございます!

CSVのためのSQLライクなクエリ言語 – csvq – を試してみた #csvq

配布場所

https://github.com/cm-hirano-shigetoshi/vim-csvq

インストール方法

普通にプラグインをインストールする方法でOKです。

標準のパッケージ機能を使う場合は

~/.vim/pack/master/start

の下などに置いてください。 詳細については以下のページが非常に詳しいので是が非でも参照して下さい。

キーバインド設定

上記方法でインストールしただけでは特にキーバインドは設定されていません。 .vimrcに自分でキーバインドを設定する必要があります。 例えばF8に設定する場合は以下を.vimrcに書きます。

nmap <F8> <Plug>(CSVQ)

まとめ

Vimのバッファ内のデータをSQLで簡単に集計するプラグインを作って見ました。 よく考えたら、別にSQLに限らず、シェルのコマンドを動作させる方が汎用性があることに気づいてしまったのですが、 SQLのクエリを書くだけの方がSQLクライアントアプリっぽくていいかな、とも思っています。

もともとは工数を管理するメモ書きを作っていて、 日付やプロジェクトコードごとに集計したいと思ったのが作ったきっかけです。 稼働時間やら工数を書いたデータを下部に書き、上部によく使うクエリをいくつか書いた形で保存しています。 工数を別の場所に入力する時には適宜クエリを実行して数値の確認などを行うことができます。

ざっと作った荒削りな出来栄えなので、好みに応じて改良して使って頂ければと思います。