業務システムの利用シーンで必ず出てくるのが、CSVファイル(カンマ区切りのデータファイル)。これをデータ分析するには、データベースに取り込むためCSVファイルをインポートしたり、Excelに貼り付けたりなど何かと手間がかかり面倒くさいです。一旦、データベースに取り込んでしまえば、SQL文を実行して集計・条件抽出・ソート・グルーピングが簡単にできるわけです。
手元にCSVファイルにあったとして、DBに取り込まずに直接CSVファイルに対して、SQL文を実行したいなあと思うことが多々あります。気軽でいいなあと・・・。探したら、ありました!
DuckDB (ダックディービー)

https://duckdb.org/ (公式サイト)
DuckDBとは
- SQLiteのような軽量データベース(ローカル環境で動く)
- 大量データ分析にも強い
- ファイル1つで動く(インストールは簡単)
- CSVなどのファイルを直接SQLで扱える
という特徴を持つ、データ分析に特化したデータベースです。
もう少し説明すると
- MITライセンス。無料で使える。
- Windows, Mac, Linux, python, node.js, Cなど各種の実行環境をサポート。
- SQLが使える(SELECT、JOIN、GROUP BY、ORDER BYなど、普段使うSQLがほぼそのまま使える)
- データをインポートしなくてもread_csv_auto()でCSVファイルを直接分析できます。大きなデータを分析するのに超便利です。
DuckDBのインストール(Windows11環境)
私が試したインストール先の環境は、Windows 11 Home(バージョン 24H2)です。Windows11ではパッケージインストーラーとして、wingetが使えます。wingetを使う例を書きます。もちろん、通常のDuckDBインストーラーも用意されていますので、必要な方は、公式サイトからダウンロードしてください。
Windowsのコマンドラインプロンプト(cmd)を起動します。今回は、duckdbというフォルダを作成しておきました。インストール手順はコマンドラインから「winget install DuckDB.cli」と同意で聞かれた時の「y」を打つだけ。
C:\prj\duckdb>winget -v
v1.10.390
C:\prj\duckdb>winget install DuckDB.cli
'msstore' ソースでは、使用する前に次の契約を表示する必要があります。
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
ソースが正常に機能するには、現在のマシンの 2 文字の地理的リージョンをバックエンド サービスに送信する必要があります (例: "US")。
すべてのソース契約条件に同意しますか?
[Y] はい [N] いいえ: y
見つかりました DuckDB CLI [DuckDB.cli] バージョン 1.3.0
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
このパッケージには次の依存関係が必要です:
- パッケージ
Microsoft.VCRedist.2015+.x64
ダウンロード中 https://github.com/duckdb/duckdb/releases/download/v1.3.0/duckdb_cli-windows-amd64.zip
██████████████████████████████ 10.0 MB / 10.0 MB
インストーラーハッシュが正常に検証されました
アーカイブを展開しています...
アーカイブが正常に展開されました
パッケージのインストールを開始しています...
パス環境変数が変更されました; 新しい値を使用するにはシェルを再起動してください。
コマンド ライン エイリアスが追加されました: "duckdb"
インストールが完了しました
(余談)テスト用のCSVファイルを準備する
手元にCSVファイルがある場合は、それを使いましょう。私はネットから拾ってきました(笑)。厚生労働省が提供する「介護サービス情報の公表システムデータのオープンデータ」というものがあり、利用規約にそって自由に使うことができます。ここに訪問看護の事業所情報(大きめのCSVファイル)がありましたので、利用させていただきました。ダウンロードファイル名は、「jigyosho_130_all_20250106192515.csv」となっていました。ヘッダ行込みで16290行もあります。CSVフォーマットを抜粋すると以下のとおり。文字コードはUTF-8でした。
- 都道府県コード又は市町村コード
- No
- 都道府県名
- 市区町村名
- 事業所名
- 事業所名カナ
- サービスの種類
- 住所
- ~以下のカラムは省略~
DuckDBを動かす
DuckDBの起動と終了
(1)DuckDB起動
C:\prj\duckdb>duckdb
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D
(2a)DuckDB終了
コントロールキー+C
(2b)DuckDB終了
.exit
DuckDBでCSVファイルに対して、SQLを動かす(その1)
全行数を調べてみます。DuckDB内からと外から実行するケースを2つ紹介します。いずれにしろ、CSVファイルをインポートせずにSQL操作していることがわかるかと思います。
select count(*) from read_csv_auto('jigyosho_130_all_20250106192515.csv');
(1)csvファイルの行数を調べる。DuckDB内から呼ぶ
C:\prj\duckdb>duckdb
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select count(*) from read_csv_auto('jigyosho_130_all_20250106192515.csv');
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 16289 │
└──────────────┘
(2)csvファイルの行数を調べる。DuckDBを外から呼ぶ
C:\prj\duckdb>duckdb -c "select count(*) from read_csv_auto('jigyosho_130_all_20250106192515.csv')"
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 16289 │
└──────────────┘
DuckDBでCSVファイルに対して、SQLを動かす(その2)
次は、ランキングを出力してみます。
select 都道府県名,count(*) as 件数 from read_csv_auto('jigyosho_130_all_20250106192515.csv')
group by 都道府県名
order by 件数 desc;
C:\prj\duckdb>duckdb
DuckDB v1.3.0 (Ossivalis) 71c5c07cdd
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D select 都道府県名,count(*) as 件数 from read_csv_auto('jigyosho_130_all_20250106192515.csv')
ツキ group by 都道府県名
ツキ order by 件数 desc;
┌────────────┬───────┐
│ 都道府県名 │ 件数 │
│ varchar │ int64 │
├────────────┼───────┤
│ 大阪府 │ 1654 │
│ 東京都 │ 1508 │
│ 愛知県 │ 1208 │
│ 神奈川県 │ 1055 │
│ 福岡県 │ 1007 │
│ 埼玉県 │ 707 │
│ 兵庫県 │ 688 │
│ 千葉県 │ 663 │
│ 北海道 │ 633 │
│ 京都府 │ 406 │
│ 広島県 │ 401 │
│ 静岡県 │ 351 │
│ 熊本県 │ 334 │
│ 群馬県 │ 321 │
│ 岐阜県 │ 320 │
│ 大分県 │ 242 │
│ 長野県 │ 242 │
│ 岡山県 │ 223 │
│ 三重県 │ 216 │
│ 沖縄県 │ 213 │
│ ・ │ ・ │
│ ・ │ ・ │
│ ・ │ ・ │
│ 滋賀県 │ 179 │
│ 長崎県 │ 178 │
│ 宮崎県 │ 178 │
│ 新潟県 │ 169 │
│ 福島県 │ 167 │
│ 青森県 │ 151 │
│ 岩手県 │ 140 │
│ 香川県 │ 140 │
│ 栃木県 │ 133 │
│ 徳島県 │ 127 │
│ 石川県 │ 122 │
│ 福井県 │ 114 │
│ 島根県 │ 109 │
│ 富山県 │ 107 │
│ 山形県 │ 104 │
│ 秋田県 │ 97 │
│ 高知県 │ 79 │
│ 鳥取県 │ 77 │
│ 山梨県 │ 75 │
│ 佐賀県 │ 70 │
├────────────┴───────┤
│ 47 rows (40 shown) │
└────────────────────┘
中間が省略されてしまうのは謎。この手のDBクライアントアプリではレスポンスを良くするため、あるまる仕様ではありますが、逆に全部出す方法がよくわからなかったです。.output使えば全部でるよというネット情報があり、試すと全部はでました。しかし、文字化けしてしまって使えませんでした。
DuckDBを使ってみての感想
DuckDBは”お気軽に”CSVファイルを分析するには、充分に使えるツールだと思いました。SQLのJoinも使えるようですし、例えば、人事CSVと勤怠CSVのJoinで条件抽出みたいなこともできそうです。インストールが簡単かつ、パソコンのリソースを食わないのもいいですね。普段使いしたいと思います。
コメント