首页 > 解决方案 > 在找到模式的地方解析多行数据

问题描述

我需要解析下面的文件,其中每一行都以日期开头,并且任何行都可以跨越多行。基本上行分隔符应该是日期而不是换行符

2021-01-01 INFO Workflow successful
2021-02-02 ERROR Workflow Failed due to below error:
    Data Type mismatch
    at Line number 30
2021-03-03 INFO Workflow successful 

代码:

import json
import re
result = []
with open(r"C:\DUMMY\log\a1.txt", "r") as f:
    lines = f.readlines()
    for line in lines:
        data = line.split(' ')
        x = re.search('^\d{4}-\d{2}-\d{2}.*?', data[0])
        if x != None:
            result.append({'Date':data[0], 'Severity':data[1], 'Message':' '.join(data[2:])})
        
data = json.dumps(result)
jsondata = json.loads(data)
print(jsondata)

实际输出:

由于第二行跨越多行,因此未解析数据。需要帮助来解析整个输出,直到找到以日期开头的下一行

[{'Date': '2021-01-01',
  'Severity': 'INFO',
  'Message': 'Workflow successful\n'},
 {'Date': '2021-02-02',
  'Severity': 'ERROR',
  'Message': 'Workflow Failed due to below error:\n'},
 {'Date': '2021-03-03',
  'Severity': 'INFO',
  'Message': 'Workflow successful\n'}]

预期输出:

[{'Date': '2021-01-01',
  'Severity': 'INFO',
  'Message': 'Workflow successful'},
 {'Date': '2021-02-02',
  'Severity': 'ERROR',
  'Message': 'Workflow Failed due to below error: Data Type mismatch at Line number 30'},
 {'Date': '2021-03-03',
  'Severity': 'INFO',
  'Message': 'Workflow successful'}]

标签: python

解决方案


您应该将 else 案例添加到:

if x != None:
    result.append({'Date':data[0], 'Severity':data[1], 'Message':' '.join(data[2:])})

考虑一行不以日期开头的情况。那是:

if x != None:
    # line contains a date
    result.append({'Date':data[0], 'Severity':data[1], 'Message':' '.join(data[2:]).strip()})
else:
    result[-1]['Message'] += ' ' + line.strip()

请注意,我做了以下假设:每一行都表示为以日期开头的行,可选地后跟更详细地描述行/错误的附加行。如果这个假设被打破,result[-1]可能会导致一个IndexError或输出不正确。


推荐阅读