csv/tsvに対しSQLを実行できるqについて現バージョンでふれてみた #q

CSV/TSV等のテキストファイルに対してSQLを実行できる「q」について、オプション指定でややハマりがあったため、備忘録としてまとめてみました。

qについて

おおまかな概要については、DevelopersIOの過去記事に上がっています。

主機能面については現在も変わりありません。

オプションの作用

delimiterskip-header以外を除いて、データ構成上にはそこまで大きな影響はないと思います。

検証には以下のデータを用いてみました。

id,name,value
1,a,0
2,b,0
3,c,1
4,d,1
5,e,2
6,f,1
7,g,1
8,h,1
9,i,2
 ,           ,
   , ,
 , ,
,,

beautify

文字幅が最大長の行に合わせて表示整形します。Terminal上での可視チェックにはつけておいた方が無難です。

% q "SELECT * FROM csv" --delimiter="," --skip-header --beautify
1   ,a,0 
2   ,b,0 
3   ,c,1 
4   ,d,1 
5   ,e,2 
6   ,f,1 
7   ,g,1 
8   ,h,1 
9   ,i,2 
    , ,  
    , ,  
    , ,  
    , ,  

output-header

ヘッダを最初の行に出力します。beautifyと組み合わせて使うケースが多いと思われます。

% q "SELECT * FROM csv" --delimiter="," --skip-header --beautify --output-header
id  ,name,value
1   ,a   ,0  
2   ,b   ,0  
3   ,c   ,1  
4   ,d   ,1  
5   ,e   ,2  
6   ,f   ,1  
7   ,g   ,1  
8   ,h   ,1  
9   ,i   ,2  
    ,    ,   
    ,    ,   
    ,    ,   
    ,    ,   

keep-leading-whitespace

空白のみのデータの場合も除去せず表示します。

% q "SELECT * FROM csv" --delimiter="," --skip-header --beautify --output-header --keep-leading-whitespace
id  ,name       ,value
1   ,a          ,0  
2   ,b          ,0  
3   ,c          ,1  
4   ,d          ,1  
5   ,e          ,2  
6   ,f          ,1  
7   ,g          ,1  
8   ,h          ,1  
9   ,i          ,2  
    ,           ,   
    ,           ,   
    ,           ,   
    ,           ,    

Sqliteを利用する

1.7.1から実装されています。実行結果をdbに保存してSQLiteにて利用できます。 --keep-leading-whitespaceの指定の有無が反映されるため、必要に応じて指定しましょう。

% q "SELECT * FROM `test.csv`" -S dbfile
Going to save data into a disk database: dbfile
Data has been loaded in 0.001 seconds
Saving data to db file dbfile
Data has been saved into dbfile . Saving has taken 0.003 seconds
Query to run on the database: SELECT * FROM `test.csv`;
% sqlite3 dbfile
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> .tables
test.csv
sqlite>

まとめ

csvやtsvのデータを用いた整形であればqがあればほぼ事足りると思います。また。計算が目的の場合はDBを利用するオプションを使うことでより素速い計算が可能となります。

他にもまだ様々なオプションが存在しますが、今回は業務にて利用した範囲での検証としました。必要に応じて活用していただければ幸いです。