# 実例 1 — 100 個の Excel を 30 秒で集計する

第 02 章「データを持つ ── JSON/CSV/YAMLで考える」の主張を裏付ける。

## 章のどの主張に対応するか

> 100 個の `.xlsx` から特定列を抽出する月次作業: Excel VBA で半日。
> `pandas` で `glob` を使って一気に処理すれば 30 秒。

(章本文「実例: 数字で見る」より)

実際にやってみると **0.07 秒**(CSV)/ **1.2 秒**(.xlsx 直)。
30 秒どころか、**100 倍以上速い**。詳細は [`results.md`](./results.md)。

## やること

1. **入力を作る**: 100 店舗 × 1 ヶ月分の売上 Excel を生成(計 10,000 行)
   - 罫線、ヘッダ太字、列幅指定 ── 普通の業務 Excel に近い体裁
2. **CSV に変換する**: pandas で 100 ファイルを `.csv` に
3. **集計する**: `pd.concat + groupby` で商品別売上ランキング(.xlsx 版と CSV 版)
4. **検索する**: `awk` で 100 ファイルから「キャベツ」だけを瞬時に抽出

全部 `make all` で動く。

## 構成

```
example-1/
├── README.md             ── このファイル
├── generate_sales.py     ── 100 店舗ぶんの .xlsx を生成
├── aggregate.py          ── pandas で 100 ファイルを集計
├── Makefile              ── 全工程
├── results.md            ── 実測値
├── xlsx/                 ── 入力 (100 ファイル, 約 824 KB)
├── csv/                  ── 変換結果 (100 ファイル, 約 380 KB)
└── out/
    ├── size-ratio.txt
    ├── aggregate.log     ── 商品別ランキングの実行ログ
    ├── summary.json      ── プログラム可読の集計結果
    └── cabbage.csv       ── awk で抽出したキャベツ全件 (817 行)
```

## 実行

```bash
pip install openpyxl pandas
make clean && make all
```

合計 数秒で完了する。

## なぜこれが「実例」になるのか

業務 Excel の月次集計を 1 つずつ開いて手作業でやれば、本当に半日かかる。
**マウスでセルを選び、Sum を打ち、コピーして別シートに貼る、これを 100 回**。
ピボットテーブルで頑張っても、再現性が無い ── 来月また同じ操作を繰り返す。

CSV にしてしまえば、**`groupby` 1 行で終わる**。同じスクリプトを来月も
そのまま使える。来年も使える。**人間が二度同じ作業をしない**。

しかも CSV は `awk`、`grep`、`cut`、`sort`、`uniq` で雑に問い合わせができる。
xlsx を `grep` しても文字列断片はヒットするが、行・列・型は取れない。

これが、章で言う「**Excel から JSON・CSV・YAML へ。一歩で、データが
画面上の見栄えから処理できる構造に変わる**」の具体形。
