kakakakakku blog

Weekly Tech Blog: Keep on Learning!

CSV に SELECT / UPDATE クエリを実行できる VS Code の拡張機能「Rainbow CSV」

定期的に 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 を確認するときにも便利で,普段から使える最高の拡張機能だった.以下からインストールできる.

marketplace.visualstudio.com

実装は GitHub に公開されていた.

github.com

サンプルデータ

今回はサンプルデータとして,よく使われる郵便番号データ KEN_ALL.CSV を使う.事前にエンコードを Shift JIS から UTF-8 に変換しておく必要がある.

$ nkf -w --overwrite KEN_ALL.CSV

KEN_ALL.CSV は日本郵便のサイトからダウンロードできる.

www.post.japanpost.jp

ハイライト機能

Rainbow CSV には「ハイライト機能」があり,CSV を VS Code で開くと,自動的にカラムごとに色分けされる.さらに各データにマウスを合わせるとカラム名を確認できるので,もしヘッダー行が存在する CSV の場合は便利.

f:id:kakku22:20181129104930p:plain

CSVLint 機能

Rainbow CSV には「CSVLint 機能」もあり,例えば,カラム数が異なるレコードがあるとエラーになる.大量のデータの中からフォーマットエラーを探すときに使える.

f:id:kakku22:20181129105029p:plain

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

github.com

SELECT を試す

実際に以下のクエリを実行した.単純な SELECT だけじゃなく WHEREGROUP BY も使えた.

SELECT * LIMIT 5
SELECT * WHERE a1 == '01101' LIMIT 20
SELECT a7, COUNT(*) GROUP BY a7

f:id:kakku22:20181129105108p:plain

(RBQL 実行画面)

UPDATE を試す

1行 UPDATE も複数行 UPDATE も実行できた.なお SELECTUPDATE「別ファイルとして」結果が出るため,直接ベースファイルを書き換えることはなく,誤った 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

クエリを実行したら「恵比寿ガーデンプレイスって階ごとに郵便番号が違うんだー」ということを発見した.今まで知らなかった!

f:id:kakku22:20181129105130p:plain

Rainbow CSV : Vim Plugin

github.com

Rainbow CSV は Vim Plugin もあり,以下のように ~/.vimrc を設定するとインストールできた.VS Code と同じく「ハイライト機能」があり,さらに F5 を押して Vim から RBQL を実行することもできた.インストールしておくべき Vim Plugin だと思う.

NeoBundle 'mechatroner/rainbow_csv'

f:id:kakku22:20181129105217p:plain

まとめ

  • VS Code の拡張機能「Rainbow CSV」は便利!
    • ハイライト機能
    • CSVLint 機能
    • RBQL (RainBow Query Language) 機能
  • Rainbow CSV には Vim Plugin もある