qコマンドを使ってみる
コンソールからtsvファイルのデータを抜き出してみた。
開発環境
- Windows XP Pro SP3 32bit
- cmd.exe
- Python 2.7.2
- q 1.5.0
使ってみる
ダウンロード
参考
http://qiita.com/astrsk_hori/items/fbe61e988f526d22efc9
試行1
ダウンロード、インストールし、コンソールを起動して以下のコマンドを実行する。
test.tsv
Id Name
0 name0
1 name1
2 name2
| 文字コード | 改行コード |
|---|---|
| UTF-8 | CR+LF |
コマンド
q -H -t "select * from test.tsv"
結果
0 name0
1 name1
2 name2
試行2
文字コード問題もOK。
| コンソール | File |
|---|---|
| CP932(Shift-JIS) | UTF-8 |
jp.tsv
Id 名前
0 山田
1 鈴木
2 田中
| 文字コード | 改行コード |
|---|---|
| UTF-8 | CR+LF |
コマンド
q -H -t -e UTF-8 -E SJIS "select * from jp.tsv where 名前 == '鈴木'"
UTF-8なjp.tsvに対して、CP932(Shift-JIS)なコンソールから、日本語のカラム名や値を指定しても大丈夫。
qのパラメータ-e UTF-8 -E SJISを指定すれば、うまいことやってくれる。
結果
1 鈴木
試行3
バッチファイル化もOK。
| .bat | .csv |
|---|---|
| CP932(Shift-JIS) | UTF-8 |
jp.tsv
Id 名前
0 山田
1 鈴木
2 田中
| 文字コード | 改行コード |
|---|---|
| UTF-8 | CR+LF |
test.bat
@echo off
call q -H -t -e UTF-8 -E SJIS "select * from jp.tsv where 名前 == '鈴木'"
pause
@echo on
qだけだと画面がすぐに消えてしまうので、qをcallした。
結果
1 鈴木
試行4
試行3のselect結果を変数JP_NAMEにセットする。
コマンド
@echo off
FOR /F "usebackq" %%i in (`q -H -t -e UTF-8 -E SJIS "select 名前 from jp.tsv where 名前 == '鈴木'"`) DO set JP_NAME=%%i
echo 名前:%JP_NAME%
pause
@echo on
早速、前回のbatイディオムが役に立った。
qが標準出力に吐き出した値を変数に入れるためだけに、複雑なFOR文を使っている。見づらすぎるが、batの限界。
なお、コンソールで実行するときは%%iを%iにすること。
結果
名前:鈴木
調べてみた
qはSQL文のどこまで使えるのか、ざっくり調べた。
概要
qはcsv,tsvファイルからSQL文のselectでデータを抽出するツールである。
ファイルの作成や追記・更新・削除はできない。
SQL文
DDL
何もできない。
| 操作 | database | table | view |
|---|---|---|---|
| create | × | × | × |
| drop | × | × | × |
| alter | ‐ | × | ‐ |
| rename | ‐ | × | ‐ |
DML
| 可 | 操作 |
|---|---|
| ○ | select |
| × | insert |
| × | update |
| × | delete |
| ○ | inner join |
| × | left join, right join |
データソース
| 可 | 入力元 |
|---|---|
| ○ | ファイル |
| ○ | 標準入力 |
| × | データベース |
他、できないこと
- 副問い合わせ
- EXISTS句
句
| 句 | 例 | 説明 |
|---|---|---|
| select | select Id, Name from a.csv |
取得したいカラム名を指定する。カンマ区切り。 |
| from | select * from a.csv from -, select * from a.csv from file.csv |
csvなどファイル名を指定する。-なら標準入力。 |
| order by | select * from a.csv order by Id asc |
並び替え。ascは昇順、descは降順。 |
| group by | select * from a.csv group by GroupId |
groupIdで集計する。 |
| join | select * from user.csv T1 join group.csv T2 on (T1.Id = T2.Id) |
複数のテーブル(csv)を結合する。 |
関数
| 関数 | 例 | 説明 |
|---|---|---|
| COUNT | select COUNT(*) from a.csv |
selectした件数を返す |
| LENGTH | select LENGTH(name) from humans.csv where id=3 |
文字列の長さを返す |
| MAX | select MAX(age) from humans.csv |
取得できた要素の中で最大値を返す |
他にも使える関数があるかもしれない。
文字コード
WindowsではコンソールがCP932(Shift-JIS)である。 でも、データソースはUTF-8。
その場合でも、正常に入出力できる。
バッチファイル
qコマンドを実行すると画面が消えてしまう。
qをcallすることで解消できた。
call q -H -t -e UTF-8 -E SJIS "select * from test.tsv"
なお、バッチファイルは以下の状態。
| 文字コード | 改行コード |
|---|---|
| CP932(Shift-JIS) | CR+LF |
というか、バッチファイルは上記以外では使えない。UTF-8にしたいのに…。
qのパラメータ例
| パラメータ | 説明 |
|---|---|
-H |
入力ファイルの1行目をヘッダとして無視する。 |
-t |
区切り文字をタブとする。 |
-e UTF-8 |
入力ファイルの文字セットをUTF-8として読み取る。 |
-E SJIS |
出力をShift-JISにする。 |
他にもいろいろある。
詳細はq --helpコマンド参照。
所感
こういうのが欲しかった。
qという名前のせいでググラビリティ低いけど、使える。
qを使えば以前いってた、.batと.shで同じパラメータ値が多重定義されてしまっている問題を解決できるかもしれない。
ユーザ名の修正箇所が1つで済めば、複数アカウントでの運用も実用的になる。