python で 固定長ファイルの読み込み、キーワードで分解し、2次元配列に格納
後からwebアプリにする事とか考えないで、とりあえず見やすいように固定長ファイル+キーワードでログをはいている場合、pandasで簡単にさばけない。
ので、しょうがないからキーワードをもとに固定長でゴリゴリスプリットして、listかtapleに入れ行きます。
配列になってたら、csvにするとかDBにinsertするとか簡単だしね。
尚、固定長と言いながら、キーワードでインデックスを取得してたりします。
固定長ライクなファイルでも応用が利くように。
読み込む元のログファイルはこんなイメージ
2020/06/01 10:00:00 PID=[0001] TYPE=[INFO] MSGID=[I0001] MSG=[処理開始] 2020/06/01 10:00:02 PID=[0002] TYPE=[INFO] MSGID=[I0002] MSG=[ファイル作成完了] 2020/06/01 10:00:05 PID=[0001] TYPE=[INFO] MSGID=[I0010] MSG=[処理完了]
で、これを読み込んで、2次元配列に格納します。
ちなみにパスを渡すとき¥は¥¥でエスケープしてあげないと、うまくうごかいないっす。
#読み込むファイルのパス file_path = 'c:\\temp\\sample.log' #log読み込み try: f = open(file_path, encoding='utf-8') #utf-8でファイルを開く line = f.readlines() #ファイルを変数lineに1行ずつ格納 f.close() except: error_code = 'Log read ERROR!' printf(error_code) fst_chk = 0 #配列の1行目かそれ以外かを判断するためのフラグ for tmp_line in line: #ファイルの1行目~最終行まで順番に読み込んで配列に格納 #実行日時 t_dt = tmp_line[0:19].replace('/','-') #x行目の0文字目~19文字目までを切り出して、変数に格納 #MySQLがYYYY-MM-DDなので、replaceで / を - に変換 #プログラムID pgm_id_idx = tmp_line.find('PID=[') #キーワードが出現するのが何文字目かを取得 t_pgm_id = tmp_line[pgm_id_idx+5:pgm_id_idx+4] #キーワードが5文字なのでそこから4文字分を取得 #処理区分 kind_idx = tmp_line.find('TYPE=[') t_kind_id = tmp_line[kind_idx+6:kind_idx+4] #メッセージID msg_id_idx = tmp_line.find('MSGID=[') t_msg_id = tmp_line[msg_id_idx+7:msg_id_idx+5] #メッセージ (最長20文字までを取得) msg_idx = tmp_line.find('MSG=[') t_msg = tmp_line[msg_idx+5:msg_idx+20] #ファイル1行をキーワード+固定長で項目ごとに分割したので、2次元配列に格納 if(fst_chk == 0): #ファイル1行目は2次元配列を作成 l_log = [[t_dt ,t_pgm_id,t_kind_id,t_msg_id,t_msg ]] #2次元配列なので、l_log = [[〇,〇]]みたいに書く fst_chk = 1 else: #ファイル2行目以降は、すでにl_logという2次元配列ができているので、appendしていく。l_log.append([〇,〇])みたいに書く。 l_log.append([t_dt ,t_pgm_id,t_kind_id,t_msg_id,t_msg ])