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

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

完成品はこちら↓

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

##

区切り文字を選んで、実行し、
![スクリーンショット 2022-10-21 19.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/0a8437ef-534f-975e-c20b-6850d646355b.png)
ファイルを選んで、
![スクリーンショット 2022-10-21 19.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/526e1764-f6ba-9000-327c-cd935dd4a6c6.png)
Excelファイルにつけたい名前を入力すれば、
![スクリーンショット 2022-10-21 20.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/00949894-3e15-8244-167e-126cb22c93db.png)
出来上がり！！
![スクリーンショット 2022-10-21 20.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704675/05040f89-377a-ec12-3d68-dbad2c19928a.png)


# 2. 機能

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

# 3. 実装

```python
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. 詳細

```python
import openpyxl as px #Excelファイルを読み書きするためのライブラリ
```
`openpyxl`を使うことでExcelファイルを操作できます。

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

```python
split = 'space' #@param ["tab", "comma", "space"] {allow-input: false}
e_name = input('Excelのファイル名を決めてください')
```
テキストファイル上の区切り文字を決める`split`はgoogle colabのフォーム機能で選べるようにしました。
参照：https://colab.research.google.com/notebooks/forms.ipynb

```python
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()`でシートを追加していきます。シート名はテキストファイルのファイル名と同じになるようにしました。

```python
  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`に応じて、どの文字で区切るかを制御します。

```python
  #セルへの書き込み
  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にして入力するようにし、それ以外の文字列はそのまま代入することにしました。

```python
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#%E3%82%BB%E3%83%AB%E3%81%AE%E5%80%A4%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF--%E5%89%8A%E9%99%A4

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