【実測】CSVファイル100個の結合、Pythonなら平均3.8秒だった|コピペで動くスクリプト付き

結論からお伝えします。CSVファイル100個(合計5,000行)を1つのExcelファイルにまとめる作業を、Python(無料で使えるプログラミング言語)のスクリプトで実測したところ、3回の平均で3.8秒でした。手作業でコピペした場合の想定時間を「1ファイルあたり30秒」として計算すると約50分(あくまで推定です)なので、うまくいけば大幅な時間短縮が期待できる結果です。

この記事では、実際に使ったスクリプトの全文と、3回計測した生の数字、そしてつまずきやすいポイントまで、再現に必要な情報をすべて公開します。

背景: 毎月の「CSVコピペ結合」がつらい

日ごと・部署ごとに分かれた売上CSVを、月末に1つのExcelにまとめる。こうした作業を手作業でやると、「ファイルを開く→全選択→コピー→貼り付け→閉じる」を延々と繰り返すことになります。

仮に1ファイルあたり30秒かかるとすると、100ファイルで約50分。この時間は実測していない推定値ですが、件数が増えるほど負担が増え、貼り付け先の行がずれる・1ファイル飛ばすといったミスも起きやすくなります。そこで「Pythonに任せたら実際何秒で終わるのか」を計測してみました。

検証環境(2026年8月11日実施)

再現条件として、検証に使った環境を明記します。

  • OS: Windows 11 Pro(ビルド 10.0.26200)
  • Python: 3.12.10
  • ライブラリ: pandas 3.0.5 / openpyxl 3.1.5(pandasは表データ処理、openpyxlはExcel書き出しに使う部品です)
  • テストデータ: ダミーの売上データ100ファイル×各50行(合計5,000行)(sales_001.csv〜sales_100.csv)。列は「日付・商品名・数量・単価・金額」の5列で、文字コードはUTF-8(BOM付き)。実在の売上データではなく、検証用に自動生成した文房具の売上風データです
  • 出力: 結合時に「元ファイル名」の列を追加するため、出来上がるExcelは6列×5,000行(+見出し1行)になります

手順: コピペで動くスクリプト全文

1. ライブラリのインストール(初回のみ)

コマンドプロンプト(Windowsの黒い画面)で次を実行します。

pip install pandas openpyxl

2. スクリプト本体

以下をメモ帳などに貼り付けて「merge_csv.py」という名前で保存します。今回の実測もこのスクリプトで行いました。

# -*- coding: utf-8 -*-
"""
バラバラのCSVファイルを1つのExcelファイル(まとめ.xlsx)に結合するスクリプト

【使い方】
1. 下の INPUT_FOLDER をCSVが入っているフォルダのパスに書き換える
2. OUTPUT_FILE を保存したい場所に書き換える(そのままでもOK)
3. このファイルを実行するだけ(python merge_csv.py)

【必要なライブラリ】
pip install pandas openpyxl
"""
import glob    # フォルダ内のファイル一覧を取得するための標準ライブラリ
import os      # ファイル名の取り出しなどに使う標準ライブラリ
import time    # 処理時間の計測用
import pandas as pd  # 表データ処理の定番ライブラリ

# ===== ここだけ自分の環境に合わせて書き換えてください =====
INPUT_FOLDER = r"C:\Users\あなたの名前\Desktop\csvフォルダ"   # CSVが入っているフォルダ
OUTPUT_FILE = os.path.join(INPUT_FOLDER, "まとめ.xlsx")  # 出力するExcelファイル
# =========================================================


def main():
    start = time.perf_counter()  # 計測開始

    # フォルダ内の *.csv を全部リストアップ(名前順に並べる)
    csv_files = sorted(glob.glob(os.path.join(INPUT_FOLDER, "*.csv")))
    if not csv_files:
        print(f"CSVファイルが見つかりません: {INPUT_FOLDER}")
        return

    # 1ファイルずつ読み込んで、どのファイル由来か分かるように列を追加
    df_list = []
    for path in csv_files:
        # encoding='utf-8-sig' はExcel由来のBOM付きUTF-8にも対応する読み方
        df = pd.read_csv(path, encoding="utf-8-sig")
        df["元ファイル名"] = os.path.basename(path)  # 元ファイル名の列を追加
        df_list.append(df)

    # 全部を縦に結合して1つの表にする
    merged = pd.concat(df_list, ignore_index=True)

    # Excelファイルとして保存(index=False で余計な行番号列を付けない)
    merged.to_excel(OUTPUT_FILE, index=False)

    elapsed = time.perf_counter() - start  # 計測終了
    print(f"完了: {len(csv_files)}ファイル / {len(merged)}行 を結合しました")
    print(f"出力先: {OUTPUT_FILE}")
    print(f"処理時間: {elapsed:.2f}秒")


if __name__ == "__main__":
    main()

3. 使い方

書き換えるのは冒頭の INPUT_FOLDER の1行だけです(出力先を変えたい場合は OUTPUT_FILE も)。CSVが入っているフォルダを指定して、python merge_csv.py で実行します。今回の実測では、INPUT_FOLDER を検証用データのフォルダに書き換えて実行しました。

実測結果: 3回の計測値

同じ条件で3回実行した結果です(計測区間はCSV読み込み開始からExcel保存完了まで。小数1桁に丸めています)。

計測 所要時間
1回目 6.2秒
2回目 3.4秒
3回目 1.9秒
平均 3.8秒

回を重ねるごとに速くなりました(6.2秒→3.4秒→1.9秒)。1回目が遅いのは、pandasなどのライブラリの初回読み込みの影響と考えられます。いずれの回も、出力されたExcelには5,000行のデータ(+見出し1行)が正しく入っていることを確認しています。

つまずきポイント3つ

文字コードは「utf-8-sig」を指定する

Excelで保存したCSVは、先頭に見えない目印(BOM)が付いたUTF-8形式のことが多く、普通の utf-8 指定だと1列目の名前が壊れることがあります。スクリプトでは encoding="utf-8-sig" を指定しており、BOMの有無どちらでも正しく読めます。もし古いシステムのCSVで文字化けする場合は "cp932"(日本語Windowsの昔ながらの形式)に変えてみてください。

出力先のExcelを開いたままにしない

出力先の まとめ.xlsx をExcelで開いたまま実行すると、保存に失敗してエラー(PermissionError)になります。実行前に必ず閉じてください。

列名がそろっていないと表がずれる

このスクリプトは「全ファイルの列名が同じ」前提です。1つだけ列名が違うファイルが混ざると、その列が別の列として横に増えてしまいます。結合後に列数がおかしくないか、一度確認するのがおすすめです。

まとめ: 推定50分の作業が実測3.8秒

100ファイル・5,000行のCSV結合は、実測で平均3.8秒(6.2秒→3.4秒→1.9秒)でした。手作業の約50分はあくまで推定値のため単純比較はできませんが、毎月発生する作業なら、スクリプト化する価値は十分にある結果だと考えています。

当ラボでは今後も「実際に動かして、数字で確かめる」検証を続けていきます。ファイル数を1,000個に増やした場合や、Excelファイル同士の結合なども順次実測していく予定です。


コメント

このブログの人気の投稿

AIしごとラボについて|AI×業務効率化を“実測”で検証するラボを始めます

【実測】CSVファイル1,000個(50,000行)の結合、Pythonなら平均59.45秒だった|100個の10倍にはならない?