それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

比較的大きなCSVファイルをぱぱっとSQLiteにインポートして楽をする

CSV ファイルを検索するのが面倒くさい。

Excelで開いて、集計関数なんて使ってるのめんどくさくないですか?私は面倒くさいです。

CSVファイルやデータログファイルをGrepするのも飽きてきました。sort して uniq して awk も良いんだけど、SQLで集計できたら楽だよね。

SQLiteでぱぱっと出来る。

CSVSQLiteで取り込んで、SQLで検索するなんて直ぐ出来る。

  1. 適当なCSVを用意して
  2. 適当なテーブルを用意して
  3. データを突っ込む
  4. sql で検索

sqlite3コマンドがあれば誰もカンタンに扱えて便利。

適当なCSVを用意する

本当に適当なCSVを用意する

1,a,b,ここは
2,b,c,あれは
3,d,e,そこは

SQLiteを開く

sqlite3 tekitou.db

テーブルを作る

sqlite> create table sample ( id , name1 , key , mm );

ココがポイント、テーブルの型定義はとりあえず要らない。だってSQLITEは全てが文字列型のテキストが前提だから。

インポートする

sqlite>.mode csv
sqlite>.import tekitou.csv sample

ここがポイント、 .import 直前で、.mode csv とすることで、csv モードになる。便利! *1

SQLで検索する

sqlite > select * from sample ;
sqlite > select sum(id) from sample ;

ああ、便利。便利すぎてヤバイ

注意点

CSVは「空白」や「クォート」文字があれば、ソレすらも取り込むので、取り込みすぎたら、sql側でupdate する必要がある。

もしくは、事前に区切り文字の後ろのクォートや空白を消しておく必要がある。

もし区切り文字を変えたいときは

現在の区切り文字を確認

sqlite > .show
     echo: off
      eqp: off
  explain: off
  headers: on
     mode: csv
nullvalue: ""
   output: stdout
separator: "," "\r\n"
    stats: off
    width:

このSeparator部分を任意に変更できる

sqlite > .separator ,
sqlite > .separator |
sqlite > .separator /

あぁ便利すぎる。find の結果を/ で取り込んだら、ファイル一覧をさくっとDBに作れて楽しかった。

これで快適SQL生活

手軽にSQLが使えるんだからどんどん使っていくべきだと思うんですよね。

JSONのように階層構造にうるさくないし、末尾のカンマ問題もないし。すげー楽。

しかもEXCEL職人芸も要らないし、ターミナルだけでぱぱっと出来る。楽しかった。

参考資料

Command Line Shell For SQLite

*1:正確には、csv モードで separator が , になってるんだとおもう