【実測】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ファイル同士の結合なども順次実測していく予定です。
コメント
コメントを投稿