こんなCSVファイルがあるとした時に 結局SQLで色々データ見るほうが簡単だよねと思う人(私)向け。CSVをRDBと見立てて、可能な限りお手軽に、SELECTしたりGROUP BY、ORDER BY したいつまりSQLを使って加工したい時にどういう選択肢があるのか、いくつか試した。
記入者 | 区分 | 更新日時 | 更新日 | プロダクト | バージョン | サブシステム | URL |
---|---|---|---|---|---|---|---|
磯野カツオ | 2021/01/15 23:45 | 2021/1/15 | Great Product | 安定Ver | ツール | https://xx.examples.com/examples=zzzz | |
フグ田サザエ | 2021/01/15 23:27 | 2021/1/15 | Great Product | 安定Ver | 汎用検索 | https://xx.examples.com/examples=zzzz | |
さくら友蔵 様 | お客様 | 2021/01/15 23:19 | 2021/1/15 | Great Product | 最新Ver | 汎用検索 | https://xx.examples.com/examples=zzzz |
フグ田タラオ | 2021/01/15 23:06 | 2021/1/15 | Great Product | 最新Ver | 未設定 | https://xx.examples.com/examples=zzzz | |
磯野波平 | 2021/01/15 23:05 | 2021/1/15 | Great Product | 最新Ver | 共通 | https://xx.examples.com/examples=zzzz | |
... | ... | ... | ... | ... | ... | ... | ... |
選択肢
1. q
q というツール。
公式ページは以下。
基本的にFROM句にCSVを指定することで使える。
C:\workspaces\files>q "SELECT COUNT(*) FROM ./all-20210101-20210131.csv "
6923
日本語文字列を含むCSVに対し、文字コードを工夫しないと以下のように言われてしまった。注意。
Could not decode query number 1 using the provided query encoding (cp932)
2. trdsql
同じく、上からダウンロードしてくるだけで使える。現在も絶賛Updateされている。
3. H2 database
Java製の H2 database。
最近のUpdateが2019-10-14とあるので少々ご無沙汰なのだろうか。
DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST(ID INT PRIMARY KEY,
NAME VARCHAR(255));
INSERT INTO TEST VALUES(1, 'Hello');
INSERT INTO TEST VALUES(2, 'World');
SELECT * FROM TEST ORDER BY ID;
UPDATE TEST SET NAME='Hi' WHERE ID=1;
DELETE FROM TEST WHERE ID=2;
以上でテーブルが作成~削除までできることが確認できる。
テーブルを作成するならCREATE文で、以下。
あるいはCSVからテーブルを作りたいなら、以下で。
DROP TABLE IF EXISTS DATA;
CREATE TABLE DATA AS SELECT * FROM CSVREAD('C:\workspaces\all-20210101-20210131.csv');
こんな感じにデータが入ります。きちんと「DBサーバー」なDBになるという点ではかなりお手軽だと思います。
4. SQLite
アプリケーションに組み込み形式のSQLite。
Windowsなら以下をDownload
sqlite-dll-win64-x64-3350500.zip
sqlite-tools-win32-x86-3350500.zip
https://bigdata-tools.com/sql-db/#2-3 にある以下2つの図が分かりやすい。
クライアント・サーバ型 (先程のH2 databaseはこれもできる)
組み込み形式 (SQLiteはこれ)
閑話休題、以下でVersion確認。
C:\sqlite-tools-win32-x86-3350500>sqlite3 --version
3.35.5 2021-04-19 18:32:05 1b256d97b553a9611efca188a3d995a2fff712759044ba480f9a0c9e98fae886
sample.db
を作成してみる。
C:\sqlite-tools-win32-x86-3350500>sqlite3 sample.db
SQLite version 3.35.5 2021-04-19 18:32:05
Enter ".help" for usage hints.
sqlite> .open sample.db
に倣い、簡単な操作。
create table if not exists TEST (
ID INT PRIMARY KEY,
NAME VARCHAR(255)
);
でテーブルが作成できることを確認する。
sqlite> create table if not exists TEST (
...> ID INT PRIMARY KEY,
...> NAME VARCHAR(255)
...> );
sqlite>
sqlite> .tables
TEST
sqlite> INSERT INTO TEST VALUES(1, 'Hello');
sqlite> INSERT INTO TEST VALUES(2, 'World');
sqlite> SELECT * FROM TEST ORDER BY ID;
1|Hello
2|World
sqlite> UPDATE TEST SET NAME='Hi' WHERE ID=1;
sqlite> SELECT * FROM TEST ORDER BY ID;
1|Hi
2|World
sqlite> DELETE FROM TEST WHERE ID=2;
sqlite> SELECT * FROM TEST ORDER BY ID;
1|Hi
無事DELETEできました。CSVファイルのインポートは以下。
create table if not exists DATA (
記入者 VARCHAR(255),
区分 VARCHAR(255),
更新日時 VARCHAR(255),
更新日 VARCHAR(255),
プロダクト VARCHAR(255),
バージョン VARCHAR(255),
サブシステム VARCHAR(255),
URL VARCHAR(255)
);
.mode csv
.import all-20210101-20210131.csv DATA
DB Browser for SQLite を使うと、こちらもお手軽にデータが見やすくなりそうです。
2022年の話題追記: Cloudflare、CDNエッジで稼働するSQLiteベースのRDB「Cloudflare D1」発表。ユーザーの近接CDNエッジに自動でデータベースを分散配置、高速アクセスを実現 - Publickey
5. Textql
試せていないが見つけたもの。
Go言語のセットアップが必要。
6. CSVq
こちらもGo。
6. Google Sheets
記入者 | 区分 | 更新日時 | 更新日 | プロダクト | バージョン | サブシステム | URL |
---|---|---|---|---|---|---|---|
列A | 列B | 列C | 列D | 列E | 列F | 列G | 列H |
磯野カツオ | 2021/01/15 23:45 | 2021/1/15 | Great Product | 安定Ver | ツール | https://xx.examples.com/examples=zzzz | |
フグ田サザエ | 2021/01/15 23:27 | 2021/1/15 | Great Product | 安定Ver | 汎用検索 | https://xx.examples.com/examples=zzzz | |
さくら友蔵 様 | お客様 | 2021/01/15 23:19 | 2021/1/15 | Great Product | 最新Ver | 汎用検索 | https://xx.examples.com/examples=zzzz |
フグ田タラオ | 2021/01/15 23:06 | 2021/1/15 | Great Product | 最新Ver | 未設定 | https://xx.examples.com/examples=zzzz | |
磯野波平 | 2021/01/15 23:05 | 2021/1/15 | Great Product | 最新Ver | 共通 | https://xx.examples.com/examples=zzzz | |
... | ... | ... | ... | ... | ... | ... | ... |
などとなっていた場合に、
例:
=query('集計したいタブ名'!A:H,"select A,G WHERE A= '磯野カツオ' or A= '磯野波平' ",1)
などという形でSQLに近いことができる。
7. Sqliteviz
ただのCSVにクエリを投げることができる。
まとめ
冒頭のやりたいこと以上に色々「データベース」とはをググりました。古い方の自分にとっては今更なSQLなのだが、相変わらずSQLというのは使える知識であることにありがたみを感じる。比較的あたらしい基本記事を参考までに貼っておく。
研修でちょっとした層構造のアプリケーションを作る前に、今時の人はいきなりNoSQLだFirebaseだとなるのだろうか...ナンノコッチャにならないものなのだろうか...。そのあたりは余計な心配としても「バックエンド」とデータベースの基本ってどう学ぶんだろうと思った時、超お手軽に「CRAD」をするものを考えた時。今回見つけたツール達も便利かなとも思った。
サーバーレスの時代も、RDB知識は無駄ではないなあと思う今日このごろ。以上参考になればさいわいです。