📝

複数のテキストファイルを1つのExcelファイルにまとめたい

2022/11/08に公開

1. 概要

研究で実験装置からたくさんのテキストファイルが出てきます。
これらのグラフ化する上で、1つずつExcelにインポートするのがめんどくさいので一気にExcel化できるようにしようと考えました。

完成品はこちら↓

https://colab.research.google.com/drive/1H_83P0nVApHKIQvfUVAyOAgPqxxx85nf?usp=sharing

区切り文字を選んで、実行し、

ファイルを選んで、

Excelファイルにつけたい名前を入力すれば、

出来上がり!!

2. 機能

  • テキストファイルの区切り文字を選ぶ
  • (複数の)テキストファイルを読み込む
  • Excelファイル名を決める
  • 各テキストファイル名をシート名とした1つのExcelファイルをつくる

3. 実装

from google.colab import files
import openpyxl as px #Excelファイルを読み書きするためのライブラリ

uploaded_files = files.upload() #ファイルをアップロード
file_names = list(uploaded_files.keys()) #アップロードしたファイル名のリスト

split = 'space' #@param ["tab", "comma", "space"] {allow-input: false}
e_name = input('Excelのファイル名を決めてください')

wb=px.Workbook() #ブックを新規作成
for file_name in file_names: #ファイル名ごと
  ws=wb.create_sheet(title=file_name) #新しいシートをつくる(シート名=ファイル名とする)

  f = open(file_name, encoding='shift-jis')
  lines=f.readlines() #すべての行をリストとして読み込み
  f.close() #ファイルを閉じる

  if split == 'tab':
    lines = [i.split('\t') for i in lines] #タブで区切る
  elif split == 'comma':
    lines = [i.split(',') for i in lines] #コンマで区切る
  else:
    lines = [i.split() for i in lines] #スペースで区切る

  #セルへの書き込み
  for i in range(len(lines)): #行ごと
    for j in range(len(lines[i])): #列ごと
      try: #数字はfloat型で記入
        ws.cell(row=i+1, column=j+1).value = float(lines[i][j])
      except:
        ws.cell(row=i+1, column=j+1).value = lines[i][j]

wb.save(f'{e_name}.xlsx')
files.download(f'{e_name}.xlsx')

4. 詳細

import openpyxl as px #Excelファイルを読み書きするためのライブラリ

openpyxlを使うことでExcelファイルを操作できます。

uploaded_files = files.upload() #ファイルをアップロード
file_names = list(uploaded_files.keys()) #アップロードしたファイル名のリスト

files.upload()でテキストファイルをアップロードできるようにし、それらのファイル名を.keys()で取得します。

split = 'space' #@param ["tab", "comma", "space"] {allow-input: false}
e_name = input('Excelのファイル名を決めてください')

テキストファイル上の区切り文字を決めるsplitはgoogle colabのフォーム機能で選べるようにしました。
参照:https://colab.research.google.com/notebooks/forms.ipynb

wb=px.Workbook() #ブックを新規作成
for file_name in file_names: #ファイル名ごと
  ws=wb.create_sheet(title=file_name) #新しいシートをつくる(シート名=ファイル名とする)

  f = open(file_name, encoding='shift-jis')
  lines=f.readlines() #すべての行をリストとして読み込み
  f.close() #ファイルを閉じる

px.Workbook()で新しいファイルをつくり、そこにwb.create_sheet()でシートを追加していきます。シート名はテキストファイルのファイル名と同じになるようにしました。

  if split == 'tab':
    lines = [i.split('\t') for i in lines] #タブで区切る
  elif split == 'comma':
    lines = [i.split(',') for i in lines] #コンマで区切る
  else:
    lines = [i.split() for i in lines] #スペースで区切る

先ほど指定した区切り文字splitに応じて、どの文字で区切るかを制御します。

  #セルへの書き込み
  for i in range(len(lines)): #行ごと
    for j in range(len(lines[i])): #列ごと
      try: #数字はfloat型で記入
        ws.cell(row=i+1, column=j+1).value = float(lines[i][j])
      except:
        ws.cell(row=i+1, column=j+1).value = lines[i][j]

各行の各列ごとにセルに値を入力していきます。そのまま入力すると数字も文字列として入力されてしまうので、float型に変更できる文字列はfloatにして入力するようにし、それ以外の文字列はそのまま代入することにしました。

wb.save(f'{e_name}.xlsx')
files.download(f'{e_name}.xlsx')

保存して終わりです。

VBAでもできそうな気がしますが、かなり便利になったので個人的には大満足です。

参考文献

https://atmarkit.itmedia.co.jp/ait/articles/2104/13/news024.html

https://tech-blog.rakus.co.jp/entry/20210729/openpyxl#セルの値の書き込み--削除

https://tech.ateruimashin.com/2020/01/python-txt-to-python/

Discussion