BlueAI株式会社BlueAI
カリキュラム/第7章: データ分析/7-3 Claude Code で大量 CSV を処理|Python 自動化

7-3 Claude Code で大量 CSV を処理|Python 自動化

無料

数万〜数百万行の CSV データを Claude Code + Python で結合・絞り込み・名寄せ・エンコード変換する実践ガイド。pandas / DuckDB の使い分け、文字化け回避、大容量ファイルの扱いを解説。

7章: データ分析45分
酒井歩乃加
監修: 酒井歩乃加

フリーランス編集者・ライター / 元マイベスト編集ディレクター

平原尚樹
監修: 平原尚樹

株式会社BlueAI 代表取締役CEO / ソフトウェアエンジニア

このレッスンで身につくこと

ここまでの章で、Excel ファイルを整理したり(第 3 章)、複数ブックを統合したり(第 4 章)、ダッシュボードに可視化したり(7-2)してきました。本レッスンはその下の層、CSV というプレーンテキスト形式の大量データ を、Python スクリプトで一気に料理するパートです。

Excel が 「人間が見るための表」 なら、CSV は 「機械が読むための表」 です。1 万行・10 万行・場合によっては 100 万行を超えるデータになると、Excel ではフリーズしますが、CSV と Python なら数秒で処理できます。Claude Code はそのスクリプトを 書く・走らせる・直す の全工程を担当できるので、SQL や Python に強くない人でも、SQL や Python の能力を持っている人と同じ景色 にたどり着けます。

ポイント

このレッスンのゴール

  • CSV 処理が スクリプト化に向く 4 つの理由 を自分の言葉で説明できる
  • 結合・絞り込み・集計・重複削除・名寄せ・エンコード変換 の 4 大パターンを、それぞれ Claude Code への 1 行指示に落とし込める
  • pandas を AI に書かせるときの 4 つのコツ を理解し、無駄なメモリ消費と遅さを避けられる
  • 文字化け / 数値型崩壊 / メモリ不足 / 改行コード混在 という 4 大失敗パターンを最初から踏まずに済む
  • コピペで使えるプロンプトテンプレート 4 つ を持ち帰り、来週以降の CSV 業務を 10 倍速で回せる
  • 月次・日次の定常 CSV 処理を、1 コマンドで再実行可能 なスクリプトとして資産化できる

所要時間 — 約 45 分(実機ハンズオン込み。読むだけなら 20 分) 難易度 — ★★★☆☆(第 3 章「Excel 整理」を済ませている前提)


CSV 処理がスクリプト化に向く理由

Excel 整理(第 3 章)との一番の違いはどこか、というところから入ります。Excel と CSV、見た目は似ていますが、Claude Code に任せたときの 適性 がまるで違います。

理由 1 — 1 行 1 レコードのストリーム処理ができる

CSV は ==1 行 = 1 レコード の単純なテキストフォーマットです。先頭から 1 行ずつ読み込みながら処理できるので、ファイル全体をメモリに乗せなくても済む== ケースが多い。これは Excel の .xlsx(内部は ZIP + XML)には絶対に真似できない強みです。

たとえば 50 万行のアクセスログを Excel で開こうとするとメモリエラーですが、Python の csv.reader でストリーム処理すれば 100MB 程度のメモリで完走します。データ量が大きくなるほど CSV の優位性 が出てきます。

理由 2 — 再現性が高い

Excel ファイルは「開いたら書式が崩れた」「保存時に勝手にカンマ区切りが書き換わった」など、環境依存の罠 が無数にあります。CSV は テキストファイルなので、いつ・誰が・どの OS で開いても同じバイト列 です。差分が取れる、git で管理できる、テスト可能。スクリプト化と圧倒的に相性が良いです。

理由 3 — 同じ処理を 1 コマンドで再実行できる

CSV 処理を Python スクリプトに落としておけば、来月・来年に同じ作業が来たときも python process.py 一発で再実行できます。1 度書いたら永遠の資産 になります。Excel の手作業は、人が異動したり退職したりすると 誰も再現できないブラックボックス になりますが、スクリプトはそうなりません。

理由 4 — Claude Code が 書いて動かして直す まで一気にやってくれる

ここが本丸です。CSV 処理のスクリプトは、ふつう次の流れで作ります。

  1. データの先頭数行を見て構造を把握する
  2. pandas か csv モジュールでスクリプトを書く
  3. 走らせる
  4. エラーが出る(文字コード、型崩壊、列名違い等)
  5. 直す
  6. もう一度走らせる

この 6 ステップが Claude Code 1 回のセッションで完結 します。エラーが出たら Claude Code がエラーメッセージを読んで自分で直しに行きます。人間がやる作業は 「何をしたいか」を 1 文で伝える ことだけ。

気づき

CSV 処理は、Claude Code に丸投げできる作業の中でも特にコスパが高い領域

Excel 整理(第 3 章)は 書式・グラフ・マクロ があるぶん毎回ハマる箇所が違いますが、CSV 処理は テキストとロジック だけなのでパターン化が効きます。「これ毎月やってる」と感じる CSV 作業を 1 つでもスクリプト化すれば、その瞬間から 毎月ゼロ秒 になります。


パターン 1 — ファイル結合・分割

CSV 処理で最も頻出するのが 結合と分割 です。月別・支店別・日別に分かれたファイルを 1 つにまとめたり、逆に巨大な 1 ファイルを切り分けたりします。

ケース 1-1 — 月別 12 ファイルを 1 年分に結合

> data/ フォルダにある 01月.csv 〜 12月.csv を 1 つの yearly.csv に結合して。
> - ヘッダー行は最初のファイルからのみ取得
> - 「ソース月」列を追加(例: 2026-04)
> - 日付列を YYYY-MM-DD 形式に統一
> - 元の 12 ファイルは変更しない
> - Python スクリプト merge.py として保存して、来月以降も再実行できるように

「来月以降も再実行できるように」 の一言で、Claude Code はハードコードではなく ==フォルダ内の *.csv を glob で拾う== 書き方をしてくれます。来月になったら 13 個目のファイルを置いて python merge.py を叩くだけ。

ケース 1-2 — 100 万行のログを月別に分割

逆に、巨大な 1 ファイルを切り分けるパターンです。

> access-log.csv(約 100 万行)を「日付」列の月別に分割して。
> - 出力: split/access-log-2026-01.csv 〜 split/access-log-2026-12.csv
> - ストリーム処理で、メモリに全行ロードしない
> - 進捗を 10 万行ごとに stdout に表示
> - 元ファイルは変更しない

「ストリーム処理で、メモリに全行ロードしない」 がポイントです。これを書かないと Claude Code は pandas で一気に読み込む コードを書きがちで、巨大ファイルだとメモリ不足で落ちます。

ケース 1-3 — 列数が違うファイルの結合

実務でいちばん厄介なのが、列構成が微妙に違うファイルの結合 です。

> 以下の 3 ファイルを縦結合して。列の順番・名前が違うので正規化が必要。
> - sales-old.csv:  Date, Item, Qty, Price
> - sales-mid.csv:  日付, 商品, 数量, 単価
> - sales-new.csv:  取引日, 品目コード, 個数, 単価, 売上額
>
> 共通列を「日付 / 商品名 / 数量 / 単価 / 売上」に正規化。
> sales-old / sales-mid は売上列がないので「数量 × 単価」で計算して埋める。
> 元の 3 ファイルは変更しない。出力は sales-unified.csv。

マッピング表を指示文に直接書く ことで、Claude Code は曖昧な推測をせずに済みます。ここを「いい感じに揃えて」と省略すると、毎回違う列に揃えられて後工程が壊れます。

ポイント

ファイル名の命名規則を最初に統一 すると、結合スクリプトが圧倒的に書きやすくなります。sales-YYYY-MM.csv のように年月をファイル名に持たせる運用にしておけば、Claude Code は ファイル名から「ソース月」を抽出 するコードまで書いてくれます。


パターン 2 — 大量データの絞り込み・集計

10 万行を超えるデータから 必要な行だけを抜き出し、グループ別に集計 するパターンです。SQL を書ける人なら WHERE + GROUP BY の世界ですが、Claude Code には日本語で渡すだけで済みます。

ケース 2-1 — 絞り込み

> orders.csv(約 30 万行)から、以下の条件に合う行だけを
> orders-filtered.csv に書き出して。
>
> 条件:
> - 注文日 2026-04-01 〜 2026-04-30
> - ステータス = "出荷済み"
> - 金額 >= 10,000
> - 顧客ランク IN ("Gold", "Platinum")
>
> 列はすべて保持。並びは注文日昇順。元ファイルは変更しない。
> 処理前に「入力 N 行 → 出力見込み M 行」を報告してから実行して。

「処理前に件数を報告して」 は、第 3 章でも触れた最強の一文です。CSV 処理ではこれを必ず添えてください。30 万行が 1 行に絞られていた ような事故を早期発見できます。

ケース 2-2 — グループ集計

> orders.csv を以下の軸で集計して。
> - 行: 顧客ID
> - 値: 注文金額の合計、注文回数、最終注文日
>
> 出力: customers-summary.csv
> 列順: 顧客ID, 合計金額, 注文回数, 最終注文日, 客単価
> 客単価 = 合計金額 ÷ 注文回数(小数 0 桁で四捨五入)
> 並び: 合計金額 降順

pandas の groupby 1 行で済むコードですが、Claude Code に依頼する側は SQL も pandas も書けなくて大丈夫 です。「軸・値・出力列順・並び」さえ言語化できれば結果が出ます。

ケース 2-3 — 二段集計(月別 × 商品別)

> orders.csv から「月別 × 商品カテゴリ別」の売上ピボットを作って。
> - 行: 注文月(YYYY-MM)
> - 列: 商品カテゴリ
> - 値: 売上合計
> - 合計行・合計列を追加
>
> 出力: pivot-monthly-category.csv
> 数値はカンマなし(後で BI に投入するため)

BI ツールに投入する CSV はカンマ区切りの数値表現にしない のがコツです。Excel で開く前提なら カンマ付き の方が見やすいですが、再加工する CSV では 生の数値 が正解です。同じデータでも、用途で出し分ける 発想を持っておくと事故が減ります。

Good

pandas の groupby は集計の主役

pandas は 100 万行程度なら 1 秒台でグルーピングを終わらせます。Excel でピボットを作ると数十秒〜数分かかる処理が、CSV + pandas なら 秒で終わる — これがスクリプト化の威力です。


パターン 3 — 重複削除・名寄せ

CSV を結合した後、ほぼ必ず襲ってくるのが 重複と表記揺れ です。同じ会社が「株式会社ブルーエーアイ/㈱ブルーエーアイ/BlueAI Inc./BLUE AI」のように 4 通りで現れる、というのが普通です。

ケース 3-1 — 完全一致での重複削除

> customers.csv の重複行を削除して。
> - 重複判定キー: メールアドレス(完全一致)
> - 重複行が複数ある場合、「最終ログイン日」が新しい方を残す
> - 削除された行は customers-duplicated.csv に別途出力
> - 削除前後の件数を報告
> 元ファイルは変更しない。出力は customers-deduped.csv。

削除された行を別ファイルに残す のが鉄則です。「消した気になってたら大事な情報まで消えていた」をリカバリ可能にできます。

ケース 3-2 — 表記揺れの名寄せ

完全一致では消えない 表記揺れ をどう処理するか、ここが本番です。

> customers.csv の「会社名」列で表記揺れを名寄せしたい。
> 以下のルールで正規化した「会社名_正規化」列を追加して。
>
> 1. 「株式会社」「㈱」「(株)」「Inc.」「Inc」「Co., Ltd.」を除去
> 2. 全角英数 → 半角英数
> 3. 全角スペース・連続スペース → 半角スペース 1 つ
> 4. 大文字小文字を区別しない(小文字に統一)
> 5. 「ブルーエーアイ」「BlueAI」「Blue AI」のようなカタカナ・英字混在は
>    レーベンシュタイン距離が 2 以下なら同一視して、最頻出の表記に統一
>
> 「会社名_原文」列は保持。==判定に迷ったものは「要確認」フラグ列を 1 にする==。
> 元ファイルは変更しない。出力は customers-normalized.csv。

「要確認フラグ」 は名寄せの命綱です。AI の名寄せは 100% にはなりません。自信のないものを人間に返す 動線を作ると、後工程の品質が一気に上がります。

ケース 3-3 — 複数キーでの突合(マスター照合)

外部からもらった CSV を、社内マスターと突き合わせて「マスターにある/ない」を判定するパターンです。

> 以下 2 つのファイルを突き合わせて、import.csv の各行を分類して。
> - master.csv: 取引可能な会社のマスター(列: 法人番号, 会社名, ステータス)
> - import.csv: 新規取り込み候補(列: 法人番号, 会社名, 担当者, メール)
>
> 突合キー: 法人番号 完全一致
> 出力 3 ファイル:
> 1. matched.csv — マスターに存在し、ステータスが「取引可能」
> 2. blocked.csv — マスターに存在するが、ステータスが「取引停止」等
> 3. unknown.csv — マスターに存在しない
>
> 各ファイルの件数を最後にサマリーで報告。

1 つの入力を 3 つの出力に振り分ける 構造は、CSV 処理の典型パターンです。これができるようになると、=='手作業の VLOOKUP' が一気に消えます。

気づき

名寄せの完璧主義は捨てる

「100% 自動で正規化したい」と思うと、Claude Code に依頼する仕様が複雑化して、結局誰もメンテできないコードになります。80% を自動・20% を人間 の発想で、要確認フラグ を活用するのが現実解です。


パターン 4 — エンコード変換(SJIS ↔ UTF-8)

日本のビジネスデータは Shift_JIS(CP932)UTF-8 の混在地獄です。Excel が出力する CSV は今でも Shift_JIS が多く、API や Web から取れる CSV は UTF-8 が標準。この 2 つを行き来する 場面が必ず来ます。

ケース 4-1 — 文字コード自動判定して UTF-8 に統一

> received/ フォルダの CSV ファイル群(取引先から届いた、文字コードがバラバラ)を、
> すべて UTF-8(BOM 付き)に統一して unified/ に保存して。
>
> - 入力ファイルの文字コードは chardet で自動判定
> - 改行コードは LF に統一(CRLF や CR が混在しているので)
> - 元ファイルは変更しない
> - 変換結果のサマリー(ファイル名・元エンコード・変換後)を report.csv に出力

UTF-8 BOM 付き にしておくと、Excel でダブルクリックしたときに文字化けしません。社内に Excel ユーザーが多い環境では BOM 付きが圧倒的に安全 です。

ケース 4-2 — 会計ソフト用に Shift_JIS で出力

逆に、会計ソフトや古い基幹システムが Shift_JIS しか読めない ケースもあります。

> sales-utf8.csv を Shift_JIS(CP932)で保存し直して sales-sjis.csv に出力。
> - 改行コードは CRLF
> - Shift_JIS にない文字(例: ① や 髙)があれば、変換できない文字を
>   warnings.csv にリストアップ
> - 変換できない文字は ? に置換せず、行をスキップして除外行リストを出力

Shift_JIS で表現できない文字をどう扱うか を明示するのが鉄則です。デフォルトの ? 置換だと、データの中身が静かに壊れて後で原因不明のエラーを引き起こします。「変換できないなら除外して報告」 の方が安全です。

ケース 4-3 — Excel の謎挙動への対処

Excel が CSV を保存すると、勝手に文字コードが変わる ことがあります。

> Excel で開いて編集した data-edited.csv の文字コードを判定して。
> Shift_JIS だった場合、UTF-8 BOM 付きに変換し直して、
> data-edited-utf8.csv として保存。
> あわせて「行頭の '」(先頭シングルクオート)が混入していないか、
> 「2026/4/1」のような Excel 由来の日付表記が混入していないかも確認。
> 混入があれば fix-needed.txt に該当列をリスト。

Excel が編集に絡んだ瞬間、CSV は別物に変わる のが日本のオフィスの現実です。Excel をパイプラインに挟むなら、必ず Excel 直後にエンコードと書式の正規化スクリプト を 1 段挟んでください。

ポイント

CSV を Excel で開いて確認するときは「読むだけ」、編集は CSV エディタで というルールを徹底すると、エンコード事故が劇的に減ります。CSV エディタの代表は「Cassava Editor」「LibreOffice Calc」「VS Code + Rainbow CSV 拡張」あたりです。


pandas を AI に書かせる際のコツ

CSV 処理スクリプトを Claude Code が書くとき、ほぼ pandas を使います。pandas は便利な反面、書き方を間違えると遅くてメモリを食う ライブラリでもあります。AI に任せるときの 4 つのコツを置いておきます。

コツ 1 — 列の型(dtype)を最初に指定させる

何も指定しないと pandas は 全列を推定 します。これが遅さとメモリ消費の最大要因。先に型を渡すと一気に速くなります。

> orders.csv を pandas で読み込むスクリプトを書いて。
> dtype を以下で明示:
> - 注文ID: str
> - 顧客ID: str(先頭 0 が消えるので必ず str)
> - 商品コード: str
> - 注文日: 文字列で読み込み後、pd.to_datetime で変換
> - 数量: int32
> - 単価: int64
> - 金額: int64
> usecols で実際に使う列だけ読む(メモリ削減)

dtype を指定する / usecols で必要列だけ読む — この 2 つを書くだけで、100 万行クラスの CSV が 数倍速く・メモリ半分 で扱えます。

コツ 2 — chunksize で分割読み込み

巨大ファイルを一気に読み込まず、チャンク で処理させます。

> 1GB の log.csv を pandas で集計して。
> - chunksize=100000 で分割読み込み
> - 各チャンクで「日付ごとのアクセス数」を集計
> - 最後に全チャンクの結果をマージ
> - メモリ使用量が 500MB を超えないように

「メモリ使用量が 500MB を超えないように」 のような 制約条件 を渡すのが効きます。Claude Code はこの制約を満たすために chunksize や ストリーミング処理を選びます。

コツ 3 — apply より vectorize / map

df.apply(lambda x: ...) は遅いです。pandas のベクトル演算を使った方が 10〜100 倍速い ことがあります。

> 既存スクリプト process.py の遅い箇所を最適化して。
> - apply / lambda を vectorize / np.where / map に置き換え可能なら置き換える
> - 置き換えできない場合はその理由をコメントで残す
> - 処理時間を before/after で計測して表示

「最適化して。理由をコメントで残して」 と書くだけで、Claude Code はベンチマーク付きで最適化版を出してきます。これを人力でやろうとすると半日仕事。

コツ 4 — Polars という選択肢

pandas に限界を感じたら Polars というライブラリがあります。Rust 製で pandas の 5〜30 倍速い場面が珍しくありません。

> 既存の pandas スクリプト merge.py を Polars 版に書き換えて。
> - インターフェースは可能な限り pandas に近づける
> - 処理時間を pandas 版と Polars 版で比較
> - 結果が完全一致することをテストで確認

pandas → Polars に書き換えるだけで月次バッチが 10 分 → 30 秒 というケースもあります。「もっと速くしたい」と感じたら 1 度試す価値があります。

ポイント

pandas を AI に書かせるときの 4 箇条

  1. dtypeusecols を最初に指定
  2. 大規模ファイルは chunksize で分割読み込み
  3. apply / lambda は最終手段、まずベクトル演算
  4. 限界を感じたら Polars

失敗パターン

CSV 処理を Claude Code に任せると、ほぼ必ずこの 4 つのどれかで 1 回はハマります。先回りして対策を入れておきます。

失敗 1 — 文字化け

ファイルを開いたら ==��== がびっしり、というあれです。

Bad

典型的なハマり方

  • Shift_JIS の CSV を UTF-8 で読み込んでクラッシュ
  • UTF-8 BOM 付きを「BOM なし」として処理して 1 列目の列名が 列名 になる
  • Excel で保存し直したら勝手に Shift_JIS に変換されていた

対策 は次の通りです。

> 入力 CSV の文字コードを chardet で自動判定してから読み込んで。
> 判定結果(信頼度含む)を最初に標準出力に表示。
> 信頼度が 0.8 未満なら、ユーザーに確認を求める。

「文字コードを自動判定して、判定結果を最初に出力して」 をプロンプトに必ず入れる。これだけで文字化け事故の 9 割は防げます。

失敗 2 — 数値型崩壊

商品コード 0012341234 に、電話番号 09012345678 が指数表記 9.01E+09 に、郵便番号 0790001790001 に。pandas の型自動推定が 先頭 0 を律儀に削る のが原因です。

Bad

事故例

  • 顧客 ID の先頭 0 が消えて、突合キーが全件不一致になる
  • 法人番号 13 桁が、Excel で開いた瞬間に指数表記化して桁落ち
  • 「1,200」がカンマ込みの文字列扱いで、SUM すると 0 が返る

対策 は次の通りです。

> 以下の列は必ず str(文字列)として読み込んで。
> - 顧客ID
> - 法人番号
> - 商品コード
> - 郵便番号
> - 電話番号
>
> カンマ区切り数値("1,200" のような表記)は、読み込み後に
> str.replace(",", "") + astype(int) で数値化。

「文字列のままにすべき列」を明示 するのが鉄則です。これを書かないと、毎回違う列が壊れます。

失敗 3 — メモリ不足

50 万行・100 万行クラスの CSV を ==pd.read_csv で一気に読む== と、メモリ不足で OS ごと固まることがあります。

Bad

典型的なハマり方

  • df = pd.read_csv("big.csv") で読んだ瞬間にメモリが 8GB 食われる
  • df.merge(other) で 2 つの大きな DataFrame をマージしてメモリ枯渇
  • Apple Silicon Mac でメモリ圧迫からスワップ地獄、ファンが轟音

対策 は次の通りです。

> 入力ファイルのサイズが 100MB を超える場合、
> 自動で chunksize=100000 のストリーム処理に切り替えて。
> 処理開始前にファイルサイズと推定メモリ使用量を表示。
> 推定が 4GB を超えるならエラー停止して、ユーザーに警告。

「サイズに応じて処理方式を切り替えて」 は地味に効きます。小さなファイルは pandas に一括で読ませた方が速いので、サイズ依存の分岐 をスクリプトに組み込むのが理想です。

失敗 4 — 改行コード混在

Windows で作った CSV(CRLF)と Mac/Linux で作った CSV(LF)と古い Mac の CSV(CR)が混在すると、行のカウントが壊れたり、最後の列に \r がくっついたりします。

Bad

事故例

  • 「東京都」が「東京都\r」になっていて、グルーピングで別グループとして集計される
  • wc -l で行数を数えると、改行コードによって違う数字が出る
  • diff を取ると全行が変更扱いになる

対策 は次の通りです。

> 入力ファイルの改行コードを自動判定して、すべて LF に統一してから処理。
> 全ての文字列カラムは前後の空白・\r・\n・\t を strip。
> strip 後に空文字になった行は、別ファイル empty-rows.csv に書き出す。

「全文字列カラムを strip」 と書いておくと、目に見えない不可視文字混入をほぼ全部潰せます。見えない文字との戦いは CSV 処理の通過儀礼 なので、最初からスクリプトに組み込んでください。


プロンプトテンプレート 4 つ

ここまでの内容を コピペで使えるテンプレート に圧縮しました。手元の Notion / Obsidian / ~/templates/csv/ あたりにコピペして、来週から使ってください。

テンプレート 1 — 結合・縦積み

{folder}/ 内の CSV ファイル({pattern})をすべて読み込み、
1 つの {output.csv} に縦結合して。

ルール:
- ヘッダー行は最初のファイルからのみ
- 「ソースファイル名」列を追加
- 列名・列順が違うファイルは {正規化マッピング} に従って統一
- 文字コードは自動判定、出力は UTF-8 BOM 付き
- 改行コードは LF に統一
- 元ファイルは変更しない
- 処理前に「対象 N ファイル → 結合後の見込み M 行」を報告
- スクリプトは merge.py として保存(来月以降も再実行可能に)

テンプレート 2 — 絞り込み・集計

{input.csv} から以下の条件で行を抽出し、集計してください。

絞り込み条件:
- {列名 1}: {条件 1}
- {列名 2}: {条件 2}
- 期間: {start} 〜 {end}

集計軸:
- 行: {行軸}
- 値: {値列}(合計 / 平均 / 件数)

出力 {output.csv}:
- 列順: {列順を明記}
- 並び順: {ソートキー}

ルール:
- 処理前に「入力 N 行 → 出力見込み M 行」を報告
- 文字列として扱う列: {ID 系列名}
- 数値カンマは除去してから集計
- 元ファイルは変更しない

テンプレート 3 — 名寄せ・重複削除

{input.csv} の {キー列} の表記揺れを正規化し、重複行を削除してください。

正規化ルール:
1. {ルール 1}(例: 「株式会社」を除去)
2. {ルール 2}(例: 全角英数を半角に)
3. レーベンシュタイン距離 <= {N} なら同一視

重複判定:
- キー: {キー列_正規化}
- 重複時の生存ルール: {最終更新日が新しい方 等}

出力:
- {output.csv}: 重複削除後
- duplicated.csv: 削除された行(元データ)
- review.csv: 判定に迷った行(要確認フラグ = 1)

ルール:
- {キー列_原文} を保持
- 元ファイルは変更しない
- 削除前後の件数を報告

テンプレート 4 — エンコード変換・改行統一

{folder}/ 内の CSV をすべて以下の仕様に統一して unified/ に保存して。

入力:
- 文字コード: chardet で自動判定
- 改行コード: CRLF / LF / CR の混在を許容

出力仕様:
- 文字コード: UTF-8 BOM 付き
- 改行コード: LF
- 全文字列カラムを strip(前後の空白・\r・\n・\t を除去)
- BOM 起因の  混入を除去

ルール:
- 変換不可文字があれば warnings.csv にリスト(ファイル名・行・列・元文字)
- 元ファイルは変更しない
- 変換結果のサマリーを report.csv に出力(元エンコード / 行数 / 変換結果)
ポイント

==4 つのテンプレートを ~/templates/csv/ に保存== しておくと、cat ~/templates/csv/merge.txt | claude のような 1 行ワークフロー で発動できるようになります。同じ作業を 2 回以上やる気配を感じた瞬間にスクリプト化、これが本章の最重要メッセージです。


月次バッチへの育て方

1 回の処理で終わらせず、月次バッチ として育てておくと ROI が跳ねます。仕上げのパートとして、スクリプトをスケジュール実行可能にする型を見ておきます。

ステップ 1 — ファイル名にパラメータを抜き出す

> merge.py を以下のように改良して。
> - コマンドライン引数で「年月」を受け取れるように
>   例: python merge.py --month 2026-04
> - 出力ファイル名に年月を埋め込む
>   例: yearly-2026-04.csv
> - 引数なしなら「今月」をデフォルトに

パラメータ化 ができていないスクリプトは、毎月コードを書き換える羽目になります。コマンドライン引数で完結 させるのが資産化の第一歩。

ステップ 2 — エラー時の通知

> merge.py の処理結果を Slack に通知する仕組みを追加して。
> - 正常終了: 件数サマリーを #data チャンネルに投稿
> - 異常終了: スタックトレースとエラー内容を #data-alerts に投稿
> - Slack の Incoming Webhook URL は環境変数 SLACK_WEBHOOK_URL から読む

「失敗したことに気づかない」 が月次バッチで最大の事故源です。Slack 通知を入れておけば、最低でも 止まったことだけは即時に分かる 状態になります。

ステップ 3 — cron / launchd で定期実行

> 毎月 1 日 9:00 に merge.py を実行する crontab エントリを書いて。
> ログは logs/merge-YYYY-MM.log に出力。
> エラー時は stderr もログに含める。
> macOS なら launchd の .plist 版も併記。

月初 9 時にコーヒーを淹れている間に、先月分のレポートが Slack に飛んできている — ここまで来ると、自動化の本当の威力を実感できます。

気づき

「1 度きりの作業」と「繰り返し作業」では、Claude Code に投資する価値が桁違い

繰り返し作業は 月次の頻度 × 1 回あたりの削減時間 × 12 ヶ月 の節約になります。1 回 60 分 → 1 分の作業を月次でスクリプト化すれば、年間で 11 時間以上 浮きます。同じ Claude Code の使用時間を投じるなら、繰り返し業務 を優先的にスクリプト化してください。


まとめ

このレッスンで押さえてほしいことを 7 つに絞ります。

  1. CSV 処理は 結合・絞り込み集計・名寄せ・エンコード変換 の 4 パターンに分解できる
  2. Excel と違って 1 行 1 レコードのストリーム処理ができるので、巨大データに強い
  3. pandas を AI に書かせるなら dtype 指定 / usecols / chunksize / ベクトル演算 の 4 箇条
  4. 文字化け / 数値型崩壊 / メモリ不足 / 改行コード混在 は CSV 処理の 4 大失敗パターン
  5. 文字列として扱う列を明示 / 要確認フラグ / 元ファイル保護 が安全運用の三種の神器
  6. テンプレート 4 種類(結合・集計・名寄せ・エンコード変換)を テンプレ化 して再利用
  7. 月次バッチに育てる とコスパが跳ねる。パラメータ化 → 通知 → スケジュール実行の 3 段階で資産化
章末演習

章末演習 — 読み終わるだけで終わらせず、ここで手を動かしましょう。所要時間 30〜40 分。

  1. あなたの業務で「毎月だいたい同じ CSV 処理をやっている」作業を 1 つ思い浮かべる。なければ、ダミーで月別 3 ファイル(合計 1000 行程度)を Claude Code に作らせる
  2. テンプレート 1(結合)を当てはめて、1 つの統合 CSV を生成。元ファイルが変更されていないことを確認
  3. テンプレート 2(絞り込み・集計)を使って、統合 CSV から 月別 × カテゴリ別 の集計表を作る
  4. 文字コードを Shift_JIS に変換した版 も併せて出力(テンプレート 4)。Excel でダブルクリックして文字化けしないことを確認
  5. 生成されたスクリプトをすべて ~/work/csv-pipeline/ に保存。パラメータ化 して、python merge.py --month 2026-05 のように月引数を受け取れるよう改造する

Bonus — 余裕があれば、ステップ 5 のスクリプトに Slack 通知 を付けてください。来月 1 日に自動実行する cron も設定すると、本章のゴールに到達です。

<Quiz question="100 万行クラスの CSV を pandas で扱うとき、メモリ不足を避けるために最も効果が大きい指示はどれ?" options={["chunksize で分割読み込みし、必要な列だけを usecols で指定する","Excel で開いて事前に行数を減らしておく","Claude Code のモデルを Opus に切り替える"]} answer={0} />

<Quiz question="CSV 処理で「数値型崩壊」を防ぐベストプラクティスは?" options={["顧客ID・郵便番号・電話番号など先頭0が消えると困る列は、str(文字列)として読み込ませる","Excel で開き直して列の書式を「文字列」に設定する","pandas の自動型推定に任せる"]} answer={0} />


次の第 8 章では、Claude Code の世界が一段広がる MCP(Model Context Protocol) を扱います。本章で作った CSV パイプラインを、Notion / Google Drive / Slack といった外部ツールと直結させる仕組みです。本章のスクリプトが「ローカルで動く単体ツール」だったのに対し、第 8 章以降は SaaS と組み合わさった業務オートメーション に育てていきます。

次のステップ