読者です 読者をやめる 読者になる 読者になる

やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

qコマンドを使ってみる

qコマンドを使ってみる

コンソールからtsvファイルのデータを抜き出してみた。

開発環境

使ってみる

ダウンロード

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だけだと画面がすぐに消えてしまうので、qcallした。

結果

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にすること。

結果

名前:鈴木

調べてみた

qSQL文のどこまで使えるのか、ざっくり調べた。

概要

qcsv,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つで済めば、複数アカウントでの運用も実用的になる。