from time import time import datetime import xlrd import os import shutil import re import sys import json import numpy as np from pandas import DataFrame; import pandas as pd from parsers.WriteToCsv import WriteBdcToCsv class BdcParser: def __init__(self, time, path): self.m_time = time self.m_path = path self.m_logLine = {} def __GetValue(self, value): if value.isdigit(): return int(value) else: if value is None or value == "": return "" else: #替换下逗号,存入csv return value.replace(",",";") def __ParserElement(self, element): components = element.split("=") if len(components) != 2: print(f"__ParserElement error {element}") return None, None value = self.__GetValue(components[1]) key = components[0] return key, value def __AddLog(self, log): type = log["event_id"] if type in self.m_logLine.keys(): self.m_logLine[type].append(log) else: list = [] list.append(log) self.m_logLine[type] = list def __ParserLine(self, line): line = line.replace("\n", "") if len(line) == 0: return ret = {} elements = line.split("|") #每个元素按|分割 if elements.count == 0: return ret ret["logtime"] = elements.pop(0) #第一个元素是时间戳 try: timeArray = datetime.datetime.strptime(ret["logtime"], "%Y-%m-%d %H:%M:%S") except : print(f"__ParserLine logtime error {line}") return ret["timeStamp"] = int(timeArray.timestamp()) for element in elements: key, value = self. __ParserElement(element) if key == None or value == None: print(f"__ParserLine error {line}") continue ret[key] = value self.__AddLog(ret) #解析每个日志文件 def Parser(self, path, filename): print(f"Parser file {path}.........\n") #读取 file = open(path, "r", encoding="UTF-8") # line = file.readline() while line: #逐行解析 #print(f"Parser file {filename} line:{line}\n") self.__ParserLine(line) line = file.readline() def __WriteCsv(self): date = self.m_time.strftime("%Y-%m-%d") for (inttype, logs) in self.m_logLine.items(): WriteBdcToCsv(inttype, logs, date) def Parsers(self): date = self.m_time.strftime("%Y-%m-%d") fileRex = f"bdcSvr_{date}" list = os.listdir(self.m_path) for filename in list: path = os.path.join(self.m_path, filename) if os.path.isfile(path) and path.find(fileRex) != -1: self.Parser(path, filename) self.__WriteCsv()