GNU Recutils 試してみた

古くは CSV や TSV、XML を経て、最近は JSON や YAML なんかで構造化データを扱うことが多い。型の概念がついたりして徐々にヒューマンリーダブルになってきたものの、もう少し実ファイルが読みやすいと良いなぁと思ったりする。そして検索なんかもできたら良いなーと思うのだが、JSON に対して jq、YAML に対して yq を書くのはまぁまぁダルい。SQLite みたいな単一 DB ファイルは扱いやすいが、SQLite の場合は実ファイルがバイナリなのでそのままテキストエディタで開くことはできない。

他に何か扱いやすいツールはないものかと調べていたところ、GNU Recutils なるツールを見つけた。

とりあえず使ってみる。今回は MacOS で、Homebrew を使って Recutils のコマンド群をインストールしてみた。

# Homebrew でインストールした
$ brew install recutils
# こんなコマンド群がインストールされる
$ ls -1 /usr/local/Cellar/recutils/1.9/bin/
csv2rec
rec2csv
recdel
recfix
recfmt
recinf
recins
recsel
recset

ということで DB ファイルに相当する .rec ファイルを作り、データを投入してみる。

# Insert : ファイルがない状態から始めるとエラーになった
$ recins -t Film -f Year -v 1985 -f Title -v 'Back To The Future 1' films.rec
recins: error: file films.rec is not writable.

# まず空ファイルを作る。実際は型定義などを自分で書き込むみたい
$ touch films.rec

# Insert
$ recins -t Film -f Year -v 1985 -f Title -v 'Back To The Future 1' films.rec

# 結果を見てみる。ファイルはテキスト形式なので、テキストエディタで加筆修正もできる
$ cat films.rec
%rec: Film

Year: 1985
Title: Back To The Future 1

# 続けて Insert
$ recins -t Film -f Year -v 1989 -f Title -v 'Back To The Future 2' films.rec
$ recins -t Film -f Year -v 1990 -f Title -v 'Back To The Future 3' films.rec
$ recins -t Film -f Year -v 1999 -f Title -v 'The Matrix' films.rec

GNU Recutils はこの .rec ファイルに対して Select や Update ができるところが面白い。

# Select
$ recsel -t Film -e "Title = 'The Matrix'" films.rec
Year: 1999
Title: The Matrix

# Update : -v ではなく -S で更新
$ recset -t Film -e "Title = 'The Matrix'" -f Title -S Matrix films.rec

# 先程の Select ではデータがヒットしなくなり…
$ recsel -t Film -e "Title = 'The Matrix'" films.rec
# 更新されていることが分かる
$ recsel -t Film -e "Title = 'Matrix'" films.rec
Year: 1999
Title: Matrix

# 結果的にファイルはこんな感じになっている
$ cat films.rec
%rec: Film

Year: 1985
Title: Back To The Future 1

Year: 1989
Title: Back To The Future 2

Year: 1990
Title: Back To The Future 3

Year: 1999
Title: Matrix

ふむ、かなり面白い。

Key: Value な形式で書いていって、空行で1レコードを示しているようだ。ただのテキストファイルであり、ヒューマンリーダブルな形式だ。先頭の % から始まるのは「テーブルのメタ情報」みたいな感じと捉えると良さそう。今回は試さなかったが、型・カラム定義やユニーク制約みたいなのもできるようだ。

コマンドから Insert・Update・Select・(今回紹介しなかったが Delete もある) などができるのも面白い。各コマンドはもっと色んな機能を持っているようなので、使いこなしたら夢がひろがりんぐだ。

難点は、このツール自体の知名度が低く、他の人と共用するには厳しそうなところか…。w