1

我想知道解析文本文件最有效的方法是什么。例如,假设我有以下文本文件:

服务器连接数为:1

服务器状态为:ACTIVE

与服务器的连接数为:4

服务器状态为:ACTIVE

服务器没有响应:13:25:03

服务器连接建立:13:27:05

我想要做的是浏览文件并收集信息。例如,与服务器的连接数,或服务器宕机的次数。我想将这些值保存在可能的列表中,以便以后查看或绘制它们。

那么执行此操作的最佳方法是什么,假设我的关键字在列表中,如下所示:

referenceLines = ['connections server', 'Server status', 'not responding']

请注意,我在列表中没有完整的句子,而只有一部分。我想逐行浏览文件,并检查读取的行是否对应于 referenceLines 列表中的任何条目,如果是,则获取列表条目的索引并调用相应的函数。

执行此操作的最有效(时间、内存)方法是什么,因为典型的文本文件大小约为 50MB。

谢谢你。

任何

4

4 回答 4

4

If every line is seperated by ": ", you can split the string.

message, value = line.split(': ', 1)
于 2012-05-22T13:04:11.353 回答
1

如果您要解析的文本文件始终包含相同顺序的相同字段,那么 mikerobi 的解决方案很好。否则,您需要遍历这些行并尝试检测参考线...

于 2012-05-22T13:19:03.413 回答
1

作为一种实用的方法,我建议您在一系列步骤中实现这一点,同时测量每个步骤的性能,以衡量您对测试数据使用的方法的成本。

例如:

  • 简单地逐行读取文件需要多长时间?
  • 如果你 split() 每行多长时间?
  • 如果在每一行上运行 re.match() 需要多长时间?

最佳解决方案将取决于您的数据,例如,您使用了多少参考线,但在现代机器上应该只需要几秒钟

于 2012-05-22T13:13:33.323 回答
1

这是一种可能的方法。它使用表单的正则表达式模式'keyword1|keyword2'一次搜索多个关键字。

def func1(line):
    #do something

def func2(line):
    #do something

actions = {'connections server': func1,
           'Server status': func2}

regex = re.compile('|'.join(re.escape(key) for key in actions))

for line in file:
    for matchobj in regex.finditer(line):
        actions[matchobj.group()](line)
于 2012-05-23T07:11:13.497 回答