今回は趣向を変えて実験をやってみたいと思います。
CSVファイルを結合する方法はいくつかありますが、一体どの方法が簡単で早いのか
同条件で実験をやってみたいと思います。
実は私も興味があり、今までやっていたやり方が楽だったんですが、今回の結果に
よっては早さ重視に変わるかも。。。
今回実験する結合方法は以下の3種類
- MS-DOS copyコマンドで結合
- Pythonプログラムで結合
- Pythonプログラムで結合(pandas利用)
メリット・デメリット
各方法には、特徴やメリット・デメリットがあります。
Windowsパソコンがあれば出来る(メリット)
CSV結合だけでなく加工もできる(メリット)
プログラム環境・プログラミングスキルが必要(デメリット)
CSV結合前に、より簡単に加工ができるため実践的(メリット)
Pythonスキルに加えて、pandasのスキルも必要(デメリット)
検証条件
CSVファイルは、1行にランダム文字列を100文字、それを10,000行を1ファイルとしたCSVファイルを1000ファイル準備しました。
CSVファイル:約1MB
100ファイル:約1000MB
このファイルを全て結合して、ひとつのファイルにするまでのタイムを競います。
もちろん、使用するパソコンは同一の物で実施します。
時間測定は、原始的ですが、ストップウォッチによる計測を3回行います。
① MS-DOS copyコマンドで結合
MS-DOSのコマンドを利用して、dataフォルダ内のcsvファイルを読み込んで、全てを1つのファイル(merge.csv)に結合します。windowsなる以前からあるコマンドなので、昔から重宝しています。
copy /b data\*.csv merge.csv
1回目:26.38 sec
2回目:23.79 sec
3回目:29.49 sec
② Pythonプログラムで結合
Pythonのプログラムで、①と同じくdataフォルダ内のcsvファイルを読み込んで、全てを1つのファイルに書き出しを行っています。やってることは①と同じです。
import glob
path = 'data\\'
files = glob.glob(path + '*.csv')
with open('merge.csv', 'wb') as f_new:
for f in files:
with open(f, 'rb') as f_org:
f_new.write(f_org.read())
1回目:23.23 sec
2回目:27.52 sec
3回目:24.35 sec
③ Pythonプログラムで結合(pandas利用)
Pythonプログラムでpandasライブラリを利用して、①と同じくcsvファイルの結合を行っています。pandasはデータを読み込んだ後の加工がとてもし易いので、「読込」-「加工」ー「書出」には向いていると思います。
import time
import pandas as pd
import glob
csv_files = glob.glob('data\\*.csv')
for file in csv_files:
df = pd.read_csv(file)
# この間に加工の処理を入れます
df.to_csv('merge.csv',index=False, mode='a')
1回目:66.13 sec
2回目:82.13 sec
3回目:64.92 sec
CSVファイル結合速度結果
結果は、以下のようになり、プログラムを書くならデータを加工して取り込む処理が必要な場合のみで、単純にCSVファイルを結合するだけなら、昔から利用しているMS-DOSのコマンドが一番簡単で処理速度も速いと言うことが再認識できました。
これからも、MS-DOSのバッチ処理は何かと利用することになりそうですね
1回目 | 2回目 | 3回目 | 平均 | |
①MS-DOS copyコマンドで結合 | 26.38 | 23.79 | 29.49 | 26.55 |
②Pythonプログラムで結合 | 23.23 | 27.52 | 24.35 | 25.03 |
③Pythonプログラムで結合(pandas利用) | 66.13 | 82.13 | 64.92 | 71.06 |