Pythonでテキストから必要な情報のみをエクセルに出力
★テキストに始点・終点の目印をつけておくことで、自動でエクセルに出力することができます。
前回(こちら)の続きです。
テキストファイルに出力した情報から、「適時開示日付」「会社名」「前任監査人」「新任監査人」といった、集計に必要な情報だけをエクセルに出力するプロセスを、何らか自動化できないかとPythonで組んでみました。
結果、どうしても(現時点の私の知見では)出力情報はひとつひとつ目で見て判断する必要があると考え、出力する情報は目視の上、始点と終点にそれぞれ「[」と「]」を入力し、後はPythonにこの範囲内のテキストをエクセルに出力させることにしました。(※「#」で始まる行はプログラムには関係ない説明文です。なので、プログラム自体は30行もありません。)
アプリケーションをまたぐ単純作業は、Pythonで自動化できる余地が大きいように思います。
今思いつくのは「発送先リストからのメールの自動配信&回答状況の自動集計&回答内容の自動集計」などですが、今後もPythonで小回りの利く効率化プログラムが作れないか、勉強を続けたいと思います。
# 前提
# pyファイルと同じ階層にテキストファイル群を保管
# pyファイルと同じ階層に、出力用として「output.xlsx」を保管(sheet1の名称のシートが必要)
# テキストファイル名をリスト化用
import glob
# マッチメソッド(m.startで始点を取得)
# re.finditerで条件に合う文字列の有無をサーチ
import re
# エクセル操作用(開く・書き込む・閉じる)
import openpyxl
# テキストファイル名を取得してリスト化
listA = list(glob.glob(‘*.txt’))
print(listA)
for i in range(len(listA)):
b = open(listA[i])
s = b.read()
b.close()
list1= [m.start() for m in re.finditer(‘\[‘, s)]
list2= [m.start() for m in re.finditer(‘\]’, s)]
print(list1)
print(list2)
# []で括った箇所をリスト化するためにlist3をブランクでセットしておく
list3=[]
n=0
for z in range(len(list1)):
# テキスト(s)から、指定された始点(list1 +1)から終点(list2)までの文字列を返す
# 返したものをlist3に追加
z = s[list1[n]+1:list2[n]]
list3.append(z)
n += 1
# list3の最後には、抽出元となったファイル名称を追加(エクセル一覧と元のファイルとの照合用)
list3.append(listA[i])
print(list3)
# エクセルを開く
wb = openpyxl.load_workbook(‘output.xlsx’)
ws = wb[‘Sheet1’]
y = 0
# 作業回数は[の数プラス、ファイル名称ということでlen()+1となる
for y in range(len(list1) + 1):
# i+1で、ファイルごとに行が変わるように指示(行への指示)
# y+1で、入力後右セルに移動するように指示(列への指示)
ws.cell(i + 1,y + 1,value = list3[y])
# list3からエクセルへの書き込みごとに保存(どこでエラーが発生したか特定可能にしたいから)
wb.save(‘output.xlsx’)
i += 1
ご参考になれば幸いです。
竹内由多可