0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CSVをSQLで集計する方法

Last updated at Posted at 2015-03-22

CSVのデータのレコード数や合計値、平均値などを求めたい時ってたまにある。

エクセルなど表計算ソフトで読み込んで求めるってのがよくやる方法だと思うが、ある列の値が同じ行の値の合計値や平均を求めたい場合では「SQLでできれば...」と思ってしまう。

そんな時にはH2DBが役立つ。

と思っていたが、2017年12月現在では Run SQL directly on CSV files | Text as Data | q の方がお手軽だと思う。

H2DBとは

Java製のRDBMS。エンジンとJDBCドライバーがjarファイル一つになっている。

H2 Database Engine

上記サイトからダウンロードできるAll Platforms向けのzipファイルにはjarファイルの他、ドキュメントやソース、起動スクリプト等も含まれている。

使い方

zipファイルを展開するとbinディレクトリが含まれている。このディレクトリにjarファイルと起動スクリプトが入っている。

コンソールの起動

binディレクトリに入って次のように起動スクリプトを実行するとWebブラウザが起動し、H2DBのWebコンソールが開く。

> ./h2.sh

最初に表示されるのはログイン画面。
CSVファイルを読み込ませて検索するだけなら、設定する項目はないので、そのまま接続ボタンを押せば良い。

H2ログイン.png

すると次のようなコンソールが表示される。
SQLステートメントにSQLを書き込んで実行ボタンを押せば良い。

H2コンソール.png

H2DBのシェル

Webコンソールよりターミナルという方は次のコマンドでH2DBのシェルを起動できる。最初に幾つか質問されるが、CSVを検索するだけならRETERN連打でOK。

java -cp h2*.jar org.h2.tools.Shell

CSVを読み込むSQLの実行

CSVを読み込むには CSVREAD 関数をFROM句で使う。

SELECT count(*) FROM CSVREAD('ファイルパス')

CSVファイルの先頭行がヘッダ行となりカラム名として認識される。
ヘッダ行がない場合には、CSVREAD関数の第2引数で指定することもできる。詳しくは CSVREAD関数のドキュメント を参照のこと

注意点としては、数字のカラムもvarcharとして読み込まれてしまうので、AVGやSUMなど数値としての計算が必要な関数を使う場合にはCAST関数CONVERT関数で数値に変換してから使う。

SELECT product, COUNT(*), SUM(CAST(cost as INT)) FROM CSVREAD('sample.csv')
GROUP BY product;

GUIツールから使う

Execute QueryのようなJDBCドライバーを組み込んでDBに接続できるツールでもH2DBは利用できる。慣れたツールがあるならそのつーるから使う方が便利。

ツールにより項目名は変わるかもしれないが、次のように設定すればよい。

設定項目 設定値
JDBCドライバ h2-1.x.xxx.jar
クラス名 org.h2.Driver
データソース jdbc:h2:mem:hoge

データソースの mem はオンメモリでの動作を示し、 hoge は何でも良い。

他に同様のツールは?

これも良さそう。

そういえば昔マイクロソフトがCSVとかApacheのログとかをSQLチックな検索言語で処理できるツールを出してたけど、どうなったのかな。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?