MacでCSVファイルをコマンドラインからSQLで編集
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