08/09 ログ・サマリーシート整形プログラムをPythonで作った

今日が振替休日とは前日まで気がつかず。家からほとんど出ないでログ・サマリーシート整形プログラムを作っていた。手書きログをボランティアが電子化したものを集計処理で使う形式に変換するのだ。

これまで、この手のテキスト処理プログラムはPerlで書いてきたけど、Pythonの勉強ということでPython 3.1で。Googleで検索し、いろんなところからコピーしてきたものを切り貼りだけど。

サマリーとログはタグで区切られているので、まずは行単位でファイルを読み込んでログの行数を数えた。サマリーシートは行を並び替えたり、挿入する操作があるので、いったん全部配列に読み込み、並び替えて書き出した。

大重さんから著者献本でいただいた『詳細! Python3入門ノート』(ソーテック社)、役にたった。

きっと、もっとエレガントな方法があるのだろうけど。

logファイルを切り出すlogcut.py

import glob
import re
import os
import argparse
keyword = '<LOGSHEET TYPE='
folder = 'log/'
def main():
    # parserを作成
    parser = argparse.ArgumentParser()
    parser.add_argument('dir_path', help='designate dir path')
    args = parser.parse_args()

    # ワイルドカードで条件を満たすパスの文字列を指定
    pathlist = glob.glob(args.dir_path + '/*.log')

    # ファイル名のみを取得
    pathlist = [os.path.basename(p) for p in glob.glob(args.dir_path + '/**', recursive=True) if os.path.isfile(p)]

    for path in pathlist:
        ##keyword以降の文字列を出力する
        with open (path, 'r', encoding='shift_jis') as f:
            text = f.read()
            idx = text.find(keyword)
            l1 = (text[idx:])
            l2 = l1.replace("</LOGSHEET>",'')
            l3 = l2.replace("<LOGSHEET TYPE=",'')
            l4 = l3.replace(">",'')
            logcut = l4.replace("\"",'')
            with open (folder + path, 'w', encoding="utf_8") as f:
#                f.write(text[idx:])
                f.write(logcut)
 
if __name__ == '__main__':
    main()

サマリーシートを切り出すsumcut.py

import glob
import re
import os
import argparse
starttag = '<LOGSHEET'
endtag = '</LOGSHEET>'
logstart = '<LOGSHEET TYPE='
userto = 'USERTO\t 6d'
version = 'SUMMARYVERSION	R2.0'
type = 'LOGSHEETTYPE	CTESTWIN'
folder = 'summary/'

def main():
    # parserを作成
    parser = argparse.ArgumentParser()
    parser.add_argument('dir_path', help='designate dir path')
    args = parser.parse_args()

    # ワイルドカードで条件を満たすパスの文字列を指定
    pathlist = glob.glob(args.dir_path + '/*.log')
     # ファイル名のみを取得
    pathlist = [os.path.basename(p) for p in glob.glob(
        args.dir_path + '/**', recursive=True) if os.path.isfile(p)]
    for path in pathlist:
        # logの行数を数える
#        with open(path, 'r', encoding='shift_jis') as f:
        with open(path, 'r', encoding='cp932') as f:
            for row, lines in enumerate(f, 1):
                if starttag in lines:
                    startline = row
                if endtag in lines:
                    endline = row
            total = endline - startline
        f.close()
    # サマリーシートの整形
#        with open(path, 'r', encoding='shift_jis') as f:
        with open(path, 'r', encoding='cp932') as f:
            text = f.read()
            idx = text.find(logstart)
        l = (userto + (re.sub('[<\/].*', '', re.sub('[<]([A-Z]*)[>]', '\\1\t', text[:idx]))))
        arrange = re.split('\t|\n', l)
        if "OPCALLSIGN" not in arrange:
            arrange.insert(6, "OPCALLSIGN")
            arrange.insert(7, " ")
        if "EMAIL" not in arrange:
            arrange.insert(18, "EMAIL")
            arrange.insert(19, "")
        if "FDCODE" not in arrange:
            arrange.insert(20, "FDCODE")
            arrange.insert(21, "")
        if "OPPLACE" not in arrange:
            arrange.insert(24, "OPPLACE")
            arrange.insert(25, "")
        if "POWERSUPPLY" not in arrange:
            arrange.insert(26, "POWERSUPPLY")
            arrange.insert(27, "")
        if "COMMENTS" not in arrange:
            arrange.insert(28, "COMMENTS")
            arrange.insert(29, "")
        if "MULTIOPLIST" not in arrange:
            arrange.insert(30, "MULTIOPLIST")
            arrange.insert(31, "")
        if "REGCLUBNUMBER" not in arrange:
            arrange.insert(32, "REGCLUBNUMBER")
            arrange.insert(33, "")
        rearrange = arrange[0] + '\t' + arrange[1] + '\n'\
        + 'MAILFROM' + '\t' + arrange[19] + '\n'\
        + arrange[2] + '\t' + arrange[3] + '\n' + version + '\n'\
        + arrange[4] + '\t' + arrange[5] + '\n' \
        + arrange[6] + '\t' + arrange[7] + '\n' \
        + arrange[8] +'\t' + arrange[9] + '\n' \
        + arrange[10] + '\t' + arrange[11] + '\n'\
        + arrange[12] + '\t' + arrange[13] + '\n'\
        + arrange[14] + '\t' + arrange[15] + '\n'\
        + arrange[16] + '\t' + arrange[17] + '\n' \
        + arrange[18] + '\t' + arrange[19] + '\n'\
        + arrange[20] + '\t' + arrange[21] + '\n' \
        + arrange[22] + '\t' + arrange[23] + '\n'\
        + arrange[24] + '\t' + arrange[25] + '\n'\
        + arrange[26] + '\t' + arrange[27] + '\n'\
        + arrange[28] + '\t' + arrange[29] + '\n'\
        + arrange[30] + '\t' + arrange[31] + '\n'\
        + arrange[32] + '\t' + arrange[33] + '\n'\
        + arrange[34] + '\t' + arrange[35] + '\n'\
        + arrange[36] + '\t' + arrange[37] + '\n'\
        + arrange[38] + '\t' + arrange[39] + '\n'\
        + arrange[40] + '\t' + arrange[41]
        summary = (rearrange.rstrip() + '\n' + type + '\n' + 'LOGSHEETLINES\t' + str(total))
        filename = path.split('.')[-2]
        print (filename)
        with open(folder + filename + '.sum', 'w', encoding = "utf_8") as f:
            f.write(str(summary))

if __name__ == '__main__':
    main()

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください