Sublime Text 3 で CSV ファイルに対して SQL ライクな処理を実行する方法
以前の記事「Sublime Text 3 で CSV ファイルを見やすく表示する方法」で、Sublime Text 3 のパッケージである rainbow_csv を使って CSV ファイルを綺麗に表示する方法を紹介しました。この記事では、既に rainbow_csv パッケージをインストール済みであることを前提にして説明します。この記事では rainbow_csv パッケージに備わっているもう1つの便利な機能を紹介していきます。EXCEL にはデータのフィルタ機能がありますが、rainbow_csv の機能を使うことによって CSV ファイルのデータを EXCEL のようにフィルタしたりして必要なデータだけを抽出することが出来るようになります。
この機能は RBQL (RainBow Query Language) と呼ばれるもので、SQL のような文法で CSV ファイルの操作が簡単にできるようになっています。SQL とは若干文法が異なりますが、SQL を理解している方であれば容易に習得可能です。それでは早速 RBQL の使い方を見ていきましょう。
サンプル CSV ファイルを入手する
まず始めにサンプル CSV ファイルを下記ウェブサイトから入手しましょう。http://eforexcel.com/wp/downloads-18-sample-csv-files-data-sets-for-testing-sales/
上記リンクからサイトにアクセスして少し下にスクロールすると以下のような部分がありますので、"100 Sales Records" をクリックしてファイルをダウンロードします。
ダウンロードしたファイルは ZIP ファイルですので解凍しましょう。解凍すると 100 Sales Records.csv というファイルがあることを確認して下さい。
それでは Sublime Text 3 を起動して、次の動画のようにファイルをドラッグ&ドロップして CSV ファイルを Sublime Text 3 で開きましょう。すると次のような表示になるはずです。
RBQL (RainBow Query Language) とは?
RBQL (RainBow Query Language) とは、rainbow_csv パッケージに備わっている SQL ライクな言語です。SQL で馴染み深い SELECT や UPDATE 操作を CSV ファイルに対して行うことが可能となっています。2019/05/15 時点でサポートされている操作は次の通りとなっています。- SELECT [ TOP N ] [ DISTINCT [ COUNT ] ]
- UPDATE [ SET ]
- WHERE
- ORDER BY ... [ DESC | ASC ]
- [ [ STRICT ] LEFT | INNER ] JOIN
- GROUP BY
- LIMIT N
また GROUP BY と共に用いることが出来る集約関数(Aggregate functions)は次の通りです。
COUNT(), MIN(), MAX(), SUM(), AVG(), VARIANCE(), MEDIAN()
SQL と大きく異なるのは "FROM" が必要ない、という点です。SQL で FROM を指定する理由は「どのテーブルからデータを抽出するのか」を指定するためですが、RBQL では検索対象テーブルは「既に表示されている CSV ファイル」を検索対象としますので "FROM" は不要となっています。
それでは早速 RBQL (RainBow Query Language) を使って CSV ファイルを操作してみましょう。
RBQL (RainBow Query Language) を使って CSV データを操作する
また下図の赤枠のように各列に対して a1, a2, a3, a4, a5, a6, a7, a8, a9, ........... のように表示されているのが分かると思います。これは各列に対する別名(Alias)となっており、SQL ライクな RBQL を実行する際に列名を a1 のように指定するために必要です。つまり一番左側の Region という列は a1 という別名、Country という列には a2 という別名が付けられているということになります。
それでは早速 RBQL を使って Region が "Asia" となっているデータだけを抽出してみます。キーボードの F5 キーを押して画面下部に入力欄が表示されている状態で、次のように入力してみましょう。
select a1, a3, a4 where a1 == "Asia"
入力した状態の画面は次のようになっているはずです。
この状態で入力欄内で ENTER キーを押してみましょう。すると下図のように Region 列が "Asia" のレコードのみ抽出されています。これは「where a1 == "Asia"」という条件をつけていることによって "Asia" のレコードのみが抽出されています。また先程の RBQL 条件で「select a1, a3, a4」と指定していましたので、1列目・3列目・4列目のレコードのみ表示されているのが分かります。
またデータを抽出した結果は、同じ Sublime Text の別タブに元の CSV ファイルとは別のファイルとして作成されています。元の CSV ファイルは "100 Sales Records.csv" ですが、RBQL を実行した結果は "100 Sales Records.csv.csv" となっています。
それでは再度元の CSV ファイルのタブに戻って F5 キーを押して次のように入力してみましょう。
select a1, COUNT(*) group by a1
すると次のような結果が表示されます。Region 毎のレコード件数を GROUP BY によって上手く集計されているのが分かりますね。
それでは次に CSV ファイル内の特定のレコードの、特定の列値のみをアップデートしてみましょう。そのためには UPDATE を使って次のように実行します。
UPDATE SET a1 = "Yuzu Tea", a2 = "Meltykiss" WHERE a1 == "Asia"
すると元のファイルは変更されずに、Sublime Text 3 の新たなタブにデータ更新結果が表示されます。