固定格式转换为表格

日志服务器收集防火墙的数据用于分析,从DB文件导出部分数据到csv,如下

"a=a1 b=b2 c=c3 devid=0 date=""2020/02/22 07:52:28"" dname=venus"
"a=a4 b=b5 c=c6 devid=0 date=""2020/02/26 07:52:27"" dname=venus"
"b=b8 c=c9 d=d10 devid=0 date=""2020/02/27 07:52:27"" dname=venus"
"b=b12 c=c9 d=d11 devid=0 date=""2020/02/27 07:52:27"" dname=venus"

目标是把日志转换为
image.png

请教大家有什么好的办法?
思路一:
csv文件进行处理,通过正则表达式处理。但是只符合格式相对统一的文本?因为1、2行与3、4行的格式不一致的。
思路二:
把字符串进行切片,转换为字典,再导入。
注意:date时间里面有个空格,切片时候会把时间也切开,导致时间不完整。

"a=a1 b=b2 c=c3 devid=0 date=""2020/02/22 07:52:28"" dname=venus" 

附自己找到认为有用的资料
http://www.imooc.com/wenda/de...
https://www.jianshu.com/p/237...

阅读 2.5k
1 个回答

data.txt内容

a=a1 b=b2 c=c3 devid=0 date=""2020/02/22 07:52:28"" dname=venus
a=a4 b=b5 c=c6 devid=0 date=""2020/02/26 07:52:27"" dname=venus
b=b8 c=c9 d=d10 devid=0 date=""2020/02/27 07:52:27"" dname=venus
b=b12 c=c9 d=d11 devid=0 date=""2020/02/27 07:52:27"" dname=venus

实现代码:

# 读取本地文件
with open('./data.txt') as f:
    # 按照行进行读取
    line_list = f.read().splitlines()

# 结果集合[{row1 dict},{row2 dict},....]
res_list = []

# 判断日期是否需要续上,默认为False
continue_flag = False

for line in line_list:
    # 按照空格进行分割,对应的k=v对
    data_list = line.split(" ")
    # 每一行生成一个row dict
    dic = {}
    # 遍历每一行,如果没有date关键词,则直接取k,v
    for data in data_list:
        if "date" in data:
            continue_flag = True
            res = data
        # 如果是碰到date把下一词的v接上来,保证时间完整性
        else:
            if not continue_flag:
                res = data
            else:
                res = res + " "+ data
                # v已经接上了后面的分钟,故continue_flag重置为False 
                continue_flag = False
        key,value = res.split("=")
        dic.update({key:value})
    res_list.append(dic)

# 生成data_frame
import pandas as pd
df = pd.DataFrame(res_list)
print(df)

产生结果:

     a    b   c    d                     date devid  dname
0   a1   b2  c3  NaN  ""2020/02/22 07:52:28""     0  venus
1   a4   b5  c6  NaN  ""2020/02/26 07:52:27""     0  venus
2  NaN   b8  c9  d10  ""2020/02/27 07:52:27""     0  venus
3  NaN  b12  c9  d11  ""2020/02/27 07:52:27""     0  venus
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题