python - 在找到模式的地方解析多行数据
问题描述
我需要解析下面的文件,其中每一行都以日期开头,并且任何行都可以跨越多行。基本上行分隔符应该是日期而不是换行符
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'}]
解决方案
您应该将 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
或输出不正确。
推荐阅读
- javascript - 字符串在元音和辅音之间交替
- python-3.x - 每次更改 Django 模型中的任何其他字段时更新当前日期时间
- python-3.x - 有没有一种简单的方法将值转换为整数?
- apache-spark - 有没有办法限制 PySpark 中某些内存密集型 UDF 计算的节点并行化?
- python - 如何在 Matplotlib 中调整绘图大小或修复日期轴?
- reactjs - 在 CodeSandbox 中反应上下文
- go - 使用 google.golang.org/api/discovery/v1 的 Golang 示例
- python - 如何创建在分隔行中打印每个字母的代码
- java - 通过jenkins使用maven运行java ProcessBuilder不起作用
- php - Wordpress:架构未以不同的语言页面显示