MacでCSVファイルをコマンドラインからSQLで編集

thumbnail

CSVの編集にはOfficeのAccessが便利だけど、MacにはAccessがない。
そこで、ターミナルからサクッとCSV編集する方法を2通り考えた。

qコマンド

シンプルなコマンドでSQL文が実行できる。
SELECT文しかないので、複雑な処理には向かない。
また、出力のときにダブルクォーテーションのエスケープができない。

インストール

MacならHomebrewでインストールできる。

$ brew install q 

よく使うオプション

詳しい使い方はこちらで確認できる。

オプション 挙動
H ヘッダーを含めてインプット。
d デリミタ指定。
O ヘッダーを含めてアウトプット。
W エスケープ。

Shift-JISで読み込んだらうまくいかなかったので、nkfで予めUTF-8に変換してから実行。

$ nkf -w --overwrite dl.csv
$ q -H -d , -O -W all "SELECT * FROM './dl.csv'" 

SQLite3

SQLiteはCSV編集ツールではなくデータベースだが、CSV編集などの用途でも便利。
インポートしても .exit したらテーブルが消えるので、こういう用途にはちょうどいい。
SELECT文だけでなく、UPDATE文も対応している。

インストール

MacならHomebrewでインストールできる。

$ brew install sqlite3 

よく使うコマンド

コマンド 動作
.tables テーブル一覧。
.separator デリミタ指定。
.import テーブルインポート。
.headers on ヘッダーを含めてアウトプット。
.mode csv CSV形式でアウトプット。
.output 出力ファイル指定。
.exit 終了。

事前に文字コードをUTF-8に変換しないと、カラム名を指定しても「no such column」となる。
ワイルドカード(曖昧検索)は % を使って表現する。
各コマンドの先頭には「.」を付けるが、SQL文には付けない。
SQL文の末尾には「;」が必要。

$ nkf -w --overwrite dl.csv
$ sqlite3
sqlite> .separator ,
sqlite> .import dl.csv item
sqlite> SELECT * FROM item;
sqlite> UPDATE item SET カラム名='値';
sqlite> .mode csv
sqlite> .headers on
sqlite> .output item.csv
sqlite> SELECT * FROM item WHERE カラム名 LIKE '%値%';
sqlite> .exit