見出し画像

PythonでExcelファイルをまとめてCSVに吐き出すボランティア活動 #Granvalley

Pythonのお題が来た気がした

こんにちは、塗師@GVです。

pythonのいい練習課題になるようなこと起きないかなーと周りを見渡したところ、会社の後輩が必死にVBAを学んでいる姿を目撃しました。


曰く、「大量にあるExcelファイルを一つのCSVに結合して、SQL ServerにBulk Insertしたい」とのこと。


ええー、そんなのストアドでループ処理してExcelのまま直接ぶち込んだ方が楽じゃねぇの??と渾身の先輩風を吹かせたところ、

「え?BulkってExcel形式取り込めませんよ?」

なにバカなこと言ってるんですか、といわんばかりの冷たい視線。

調べてみたらどうやら本当。Microsoftのドキュメントに前提条件として「最初に Excel データをテキスト ファイルにエクスポートする必要があります。」とハッキリ書かれていました。

お前同じMicrosoft製品なのにExcelを仲間外れにするのやめろよ!

見栄を張ったばかりに恥ずかしい思いをしました。とはいえpythonのお題が欲しかったところに良い話が流れてきましたし、これでパパっとコードを書いて後輩にカッコいいところを見せてやりましょう。

早速作ってみよう

後輩からは何一つ頼まれていませんが、見栄と勉強のためにもpythonでプログラムを書いていこうと思います。将来自分が大量のExcelファイルを1つのCSVにまとめたい気分になったときにも、きっと役立ちます。

#必要なものをインポート
import pandas as pd
from glob import glob

# 受け皿になる空のデータフレーム作成
df = pd.DataFrame()


# 処理対象のファイルが入ったフォルダパスを指定
targetpath = input(('対象のフォルダパスを指定してください:').strip())

# 結果を書き出すフォルダパスを指定
resultpath = input(('結果書き出しのパスを指定してください:').strip())

# 書き出し結果のファイル名を指定
csvname = input(('書き出し結果ファイルの名前を入力してください(例:test.csv):').strip())

# 書き出し先のフォルダパスとファイル名を結合
resultcsv = resultpath + "\\" + csvname

# ヘッダー有無の指定
headers = input(('Excelファイルにヘッダー行はありますか?(yes/no):').strip())
if headers == 'yes':
   headers = 0
else:
   headers = None


   
# 対象フォルダ内のExcelファイルをリスト化
excels = glob(targetpath + r"\*xls*", recursive=True)

# リストから1つずつBookを取り出す
for excel in excels:
   book = pd.ExcelFile(excel)

   # 取り出したBookから1つずつシートを読み込んでテンポラリのDataFrameにする
   for sheet in book.sheet_names:
       temp_df = pd.read_excel(excel, sheet_name=sheet, header=headers)

       # テンポラリデータフレームをマージ用データフレームに追加
       df = pd.concat([df, temp_df])


# 最後にマージ用データフレームをcsvへ書き出す
df.to_csv(resultcsv, sep=',', index=False, header=False)

うーん、シンプル。Excelファイルの入ったフォルダのパスと、結合したCSVの吐き出し口を指定すれば、カンマ区切りのCSVとなって吐き出されます。

そもそもデータフレームにしたならそのままDBにぶち込めという話なのですが、そこは後輩のゴールであって僕のゴールではありません。無視です。

これをそのまま送りつけたいところですが、たぶん後輩の現場のPCにはpython がインストールされていないのでこのままだと動きません。

そこで、下記の記事を頼りにexeファイルを作成して送ることにしました。

【初心者向け】のタイトル通り、とても易しくわかりやすい内容でした。IT企業に勤めているのに初心者向けの記事を漁るなと誹りを受けそうですが、そんなことは知ったことじゃありません。初めてやることはいつだって誰だって初心者です。

重すぎる…

よしよし、これで完成したexeファイルを送れば後輩も喜んで、僕のことを尊敬するようになるだろう。ニヤニヤしながら圧縮したファイルをメールに添付したところ…

え……?

サイズオーバー?そんなに重いの…?確認してみると…


おっも!!!!595MBて!!!!!

どうやらexe化する際、Anaconda環境の要らんライブラリまでご丁寧にバンドルしてるためこんなことになっているようです。

ダイエット大作戦

exeファイルのダイエット方法はGoogle先生に聞きます。自分で突き止める意地やプライドなんてものは始めから持ち合わせていません。

なるほど、exe作成用の仮想環境を作って余計なライブラリを入れなければいいのか!そりゃそうだ!早速実行してみると……

激痩せじゃないですか

え、ちょ…大丈夫??突然体重が1/10になる人がいたら病気か超常現象を疑います。人体ではなくデータの塊とはいえ、こんなにたくさん減って大丈夫なのかという気になります。

一応動作確認もしてみましたが、どうやら平気なようです。逆に痩せる前どれだけ余計なもの入ってたんだと…

というかこれ、普段の開発環境のとっ散らかり具合を晒し上げてるだけのような…

思考停止で同一環境にpip installしまくるのはやめよう!(当たり前)

まとめ

いろいろ本を読んだり動画を見ていても、実際使ってみないとなかなか身につかないのがプログラミングだなーと常々思います。

今回のようにやりたいことが定まっていると捗ります。こういった機会に無理やりにでも書いてみると、なんだか勉強になる気がしますね。

問題にぶつかった数=学習量なので、積極的に問題にぶつかっていく修行僧の心持ち(ドM精神)が大事だと思いました。

ちなみに送り付けたexeファイルは使われませんでした。

それでは


グランバレイに興味がある方はこちら


この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

13
データ分析コンサルティング企業のグランバレイでソリューションマネージャーをしています。BI、データ分析、プレゼンテーション、英語、プログラミングについてお話していきたいです。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。