0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

1. 概要

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

完成品はこちら↓

区切り文字を選んで、実行し、
スクリーンショット 2022-10-21 19.58.15.png
ファイルを選んで、
スクリーンショット 2022-10-21 19.59.46.png
Excelファイルにつけたい名前を入力すれば、
スクリーンショット 2022-10-21 20.00.19.png
出来上がり!!
スクリーンショット 2022-10-21 20.01.35.png

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でもできそうな気がしますが、かなり便利になったので個人的には大満足です。

参考文献

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?