それっぽい技術メモ

UNIXからpythonまで、技術系メモ。知識は人類の共有財産です。

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 ])