1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CSVをSQLデータベースのように扱えるqコマンドの使い方

1
Posted at

qコマンドとは?

q - Text as Data が提供するqコマンドは、.csvファイルをあたかもデータベースであるかのようにさまざまなSQLクエリを実行して操作することのできるコマンドです。SQLの構文はSQLite3に準拠しています。

インストール

Windows

GitHubのReleasesページからインストーラー (.msi) をダウンロードし、インストールします。

または、パッケージマネージャであるscoopを使用している場合は以下のコマンドでインストールすることもできます。

scoop install q

いずれの場合も、インストールが完了するとPATHにqが追加されます。

wingetではインストールできません (winget install qでは同名の別のツールがインストールされます)。

Linux

GitHubのReleasesページから.rpmまたはdebをダウンロードし、以下のコマンドを実行します。

# Red Hat系 (Fedoraなど) の場合
rpm -ivh <package-filename>

# Debian系 (Ubuntuなど) の場合
sudo dpkg -i <package-filename>

aptが使える場合は、以下のコマンドでもインストールできます。

sudo apt install python3-q-text-as-data

MacOS

brewでインストール可能です。

brew install harelba/q/q

インストールの確認

q -vを実行してバージョン情報が正しく出力されればインストール成功です。

q version 3.1.6
Python: 3.14.4 (main, Jun 18 2026, 14:25:02) [GCC 15.2.0]
Copyright (C) 2012-2021 Harel Ben-Attia (harelba@gmail.com, @harelba on twitter)
http://harelba.github.io/q/

以下では、Windows PowerShellを使用します。Bashターミナルでは使用できないコマンドも含まれますので、ご了承ください。

基本的な使い方

基本構文

SQLクエリはダブルクオーテーションで囲ってqに渡します。
ヘッダーが存在しない場合、カラム目はc1, c2, ...となります。

q -<option> <value> "<sql-query>"

主なオプション

# ヘルプを表示
-h, --help

# キャッシュモードの指定
-C <モード>, --caching-mode=<モード>

# ヘッダー行がある場合にヘッダーを認識
-H, --skip-header

# 区切り文字を指定
-d '<区切り文字>', --delimiter='<区切り文字>'

# タブ文字が区切り文字の場合に使用
-t, --tab-delimited

# データの構造を解析して出力
-A, --analyze-only

# 出力にヘッダーを含める
-O, --output-header

# 出力の体裁を整える
-b, --beautify

PowerShellで区切り文字を指定するときは、-d ','のように引用符で囲む必要がありますが、Bashでは-d ,と続けて書くことができます。

パラメータのデフォルトを設定

qコマンドに渡すオプションのデフォルトの値を設定することができます。ユーザディレクトリ直下に~\.qrcを作成し、以下のように記述します。

[options]
<option>=<value>

後述しますが、以下のようにキャッシュモードをreadにしておくと便利です。

.qrc
[options]
caching_mode=read

使用例

ここでは、サンプルデータとしてiris.csvを使用します。
以下のコマンドで.csvファイルを保存します。

curl -O https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv

ちなみに、iris.csvの中身は以下のようになっています。

iris.csv
sepal_length,sepal_width,petal_length,petal_width,species
5.1,3.5,1.4,0.2,setosa
4.9,3.0,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
...

qでSQLクエリを実行

# データ数を表示。ヘッダー行を認識させ、区切り文字に','を指定
q -H -d ',' "SELECT COUNT(*) FROM iris.csv"

# sepal_lengthが7.5より大きいデータをヘッダー付きで降順で表示
q -H -b -d ',' -O "SELECT species, sepal_length, petal_length FROM iris.csv WHERE sepal_length > 7.5 ORDER BY sepal_length DESC"

ExcelでCSV UTF-8形式で保存したファイルなど、BOM付きの.csvを読み込むと、ヘッダーが正しく認識されない場合があります。その場合は、-e utf-8-sigで入力エンコーディングを指定してください。

パイプで他コマンドの出力を直接クエリする

他コマンドの出力をデータセットとして直接SQLクエリを実行することできます。この場合は、データセットに-を指定します。

# カレントディレクトリとサブディレクトリ下の全てのファイル情報のうち
# 拡張子とファイルサイズを出力し、csvに保存
Get-ChildItem -Recurse -File | Select-Object Extension,Length | ConvertTo-Csv -NoTypeInformation > current-directory.csv

# 拡張子ごとのファイル数を集計し、上位5種類の拡張子を降順に表示
q -H -d ',' -O -b "SELECT Extension ext, COUNT(*) n FROM current-directory.csv GROUP BY Extension ORDER BY n DESC LIMIT 5"

# BOMなしエンコーディングを指定
$OutputEncoding = New-Object System.Text.UTF8Encoding $false
# パイプによりcsvファイルを保存することなくSQLクエリを実行
Get-ChildItem -Recurse -File | Select-Object Extension,Length | ConvertTo-Csv -NoTypeInformation | q -H -d ',' -O -b "SELECT Extension ext, COUNT(*) n FROM - GROUP BY Extension ORDER BY n DESC LIMIT 5"

キャッシュファイルの利用

qは、キャッシュファイルを生成し再利用することで処理時間を速めることができます。例として、極端にデータ数の大きいデータセットを用いてSQLクエリを実行してみます。

# データ数の多いデータセットを作成
seq 1 1000000 > myfile.csv

# PowerShellのMeasure-Commandを利用して処理時間を出力させる (Bashではtimeコマンド)
Measure-Command { q "SELECT SUM(c1), COUNT(*) FROM myfile.csv" | Out-Default }

上記のコマンドを実行することで、{}内の処理の実行結果と実行時間が表示されます。いろいろな単位で時間が表示されますが、TotalSecondsの行を見てください。環境によって変わるとは思いますが、私の環境では2.27秒でした。

続いて、オプションに-C readwriteを指定することでキャッシュファイル (.qsql) を生成させます。

q "SELECT SUM(c1), COUNT(*) FROM myfile.csv" -C readwrite

実行時間は先ほど同じくらいのはずです。カレントディレクトリに、myfile.csv.qsqlが生成されます。このキャッシュファイルを読み込んで先ほどと同様のクエリを実行し、処理時間を計測してみます。

Measure-Command { q "SELECT SUM(c1), COUNT(*) FROM myfile.csv" -C read | Out-Default }

先ほどとは劇的に処理時間が短くなっているはずです。私の環境では0.14秒でした。

このように、サイズの大きなデータセットではキャッシュファイルを利用することで処理を速くすることができます。キャッシュファイルはカレントディレクトリに存在し、かつ-C readまたは-C readwriteが指定されている場合にのみ読み込まれます。そのため、~\.qrcファイルに-C readと記述し、必要に応じて-C readwriteでキャッシュファイルを生成させるように運用するのが便利です。

まとめ

.csvファイルはExcelで開くことができますので、Excelでデータ分析をすることは十分に可能なのですが、それをqコマンドはCLI上でSQLライクに操作できるのが強みです。皆さんもぜひ活用してみてください。

各種リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?