ちょっと話題の記事

CSVのためのSQLライクなクエリ言語 – csvq – を試してみた #csvq

CSVファイルに対してSQLを実行できるライブラリ「csvq」を試してみました。かゆい箇所に手が届いた感じです。
2019.02.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今朝方、CSVに対してSQLを実行できる「csvq」というライブラリを知りました。業務の関係で快適にCSVを操作する方法を求めていたこともあって、操作感等含めて試してみました。

特徴

関係するオプションも合わせて表記してみました。

  • 標準のデリミタがコンマ--write-delimiter
  • 出力先指定オプションがある --out
  • 色つけできる --color
  • 標準で罫線がついてる--format
  • タイムゾーンの設定ができる --timezone
  • 手軽に対話シェルとして実行できる
  • Ambiguous Character を全角文字の幅で表示可能--east-asian-encoding
  • ゼロ幅スペースを半角文字としてカウント--count-format-code
  • 改行コードを指定可能--line-break

CSVに対して各種操作を行う際に、あると助かるオプションが一通り備わっています。

実行

DBを操作している感覚で、気軽な集計が高速に可能です。

go get github.com/mithrandie/csvq

サンプルデータ

% cat << EOT >> data.csv
id,name,value
1,a,0
2,b,1
3,c,1
EOT

単純実行

特に何も指定しない場合はテーブル表示となります。

% csvq "SELECT * FROM data WHERE value > 0"
+----+------+-------+
| id | name | value |
+----+------+-------+
| 2  | b    | 1     |
| 3  | c    | 1     |
+----+------+-------+

CSV出力

結果をCSVとして外部ファイルに出力したい場合は、--out--formatをつけましょう。

% csvq -o result.csv -f CSV  "SELECT * FROM data WHERE value > 0"
% cat result.csv
id,name,value
2,b,1
3,c,1

まとめ

業務にて行数10万レコード超え(多い場合は多分100万は超える)CSVファイルを計算加工等する必要があり、AWSにて S3 -> Glue -> Athena と順を追って加工した上でSQLを組み立てるしかないかと思っていたところでしたが、csvqでかなり楽になる感じです。

CSVへの操作をどうするか迷っている方にはとてもオススメできるライブラリだと思います。