定期的に CSV からデータを抽出する機会があり,抽出条件によって,今までは以下のような方法を使っていた.
- CSV を Excel で開いてフィルターを使う方法
- CSV を grep / egrep などの Linux コマンドで絞り込む方法
- CSV をAmazon S3 にアップロードして Amazon S3 Select でクエリを実行する方法
Rainbow CSV
新しい方法として VS Code の拡張機能「Rainbow CSV」を試すことにした.Rainbow CSV には多くの機能があり,例えば「ハイライト」や「CSVLint」や「RBQL (RainBow Query Language)」がある.データを抽出する用途だけでなく,CSV を確認するときにも便利で,普段から使える最高の拡張機能だった.以下からインストールできる.
実装は GitHub に公開されていた.
サンプルデータ
今回はサンプルデータとして,よく使われる郵便番号データ KEN_ALL.CSV
を使う.事前にエンコードを Shift JIS
から UTF-8
に変換しておく必要がある.
$ nkf -w --overwrite KEN_ALL.CSV
KEN_ALL.CSV
は日本郵便のサイトからダウンロードできる.
ハイライト機能
Rainbow CSV には「ハイライト機能」があり,CSV を VS Code で開くと,自動的にカラムごとに色分けされる.さらに各データにマウスを合わせるとカラム名を確認できるので,もしヘッダー行が存在する CSV の場合は便利.
CSVLint 機能
Rainbow CSV には「CSVLint 機能」もあり,例えば,カラム数が異なるレコードがあるとエラーになる.大量のデータの中からフォーマットエラーを探すときに使える.
RBQL (RainBow Query Language) 機能
なんと言っても Rainbow CSV で1番便利な機能は「RBQL (RainBow Query Language) 機能」で,RBQL という SQL-like なクエリ言語でデータを抽出することができる.RBQL の仕様は以下のドキュメントにまとまっている.SELECT
だけだと思ったら UPDATE
もサポートされていた!CSV を UPDATE
で更新できるのはスゴイ!
SELECT [ TOP N ] [ DISTINCT [ COUNT ] ]
UPDATE [ SET ]
WHERE
ORDER BY ... [ DESC | ASC ]
[ [ STRICT ] LEFT | INNER ] JOIN
GROUP BY
LIMIT N
SELECT を試す
実際に以下のクエリを実行した.単純な SELECT
だけじゃなく WHERE
と GROUP BY
も使えた.
SELECT * LIMIT 5 SELECT * WHERE a1 == '01101' LIMIT 20 SELECT a7, COUNT(*) GROUP BY a7
(RBQL 実行画面)
UPDATE を試す
1行 UPDATE
も複数行 UPDATE
も実行できた.なお SELECT
も UPDATE
も「別ファイルとして」結果が出るため,直接ベースファイルを書き換えることはなく,誤った RBQL を実行しても影響なしという安心感も良かった.
UPDATE SET a4 = 'aaaaa' WHERE a3 == '0600000' UPDATE SET a4 = 'aaaaa' WHERE a1 == '01101'
RBQL backend language を試す
RBQL backend language を使うと RBQL を拡張できる.現状だと JavaScript と Python がサポートされている.
- JavaScript – RBQL backend language
- Python – RBQL backend language
今回は JavaScript を使って RBQL を拡張してみた.
-- 郵便番号が "15060" で始まるデータを抽出する SELECT * WHERE a3.indexOf("15060") == 0 -- データとは関係なく乱数を10件出力する SELECT Math.random() * 100 LIMIT 10 -- データとは関係なく文字列を結合して出力する SELECT 'ka'.repeat(3) + 'kakku' LIMIT 5
クエリを実行したら「恵比寿ガーデンプレイスって階ごとに郵便番号が違うんだー」ということを発見した.今まで知らなかった!
Rainbow CSV : Vim Plugin
Rainbow CSV は Vim Plugin もあり,以下のように ~/.vimrc
を設定するとインストールできた.VS Code と同じく「ハイライト機能」があり,さらに F5
を押して Vim から RBQL を実行することもできた.インストールしておくべき Vim Plugin だと思う.
NeoBundle 'mechatroner/rainbow_csv'
まとめ
- VS Code の拡張機能「Rainbow CSV」は便利!
- ハイライト機能
- CSVLint 機能
- RBQL (RainBow Query Language) 機能
- Rainbow CSV には Vim Plugin もある