0

对于我自己的一个小项目,我正在编写一个解析器来解析来自某个应用程序的事件日志。通常我处理这样的事情不会有什么问题,但问题是这些日志中的字符串并不总是具有相同的参数。例如,一个这样的字符串可能是:

DD/MM HH:MM:SS.MSEC TYPE_OF_EVENT SOURCE, SOURCE_FLAGS, TARGET, TARGET_FLAGS, PARAM1

在另一种情况下,字符串可能有一系列参数,一直到 27 个,另一个有 16 个。阅读文档,参数中有一些逻辑,例如,第 17 个参数将始终包含一个整数。虽然这很好,但不幸的是第 17 个参数可能是字符串中的第 7 个参数。每个字符串上唯一真正不变的是时间戳和第 6 个第一个参数。

我将如何解析这样的字符串?很抱歉,如果我的问题有点不清楚,我觉得很难说出我的问题。

4

4 回答 4

1

我会使用不同的日志记录解决方案,或者找到一种方法来修改它,以便您有空的占位符、item、、item3、、、item6 等。

只是我的意见,不太了解这个应用程序 - 这个应用程序听起来不太好。我通常通过这样的因素来判断应用程序,如果没有充分的理由使日志文件不标准化,那么您认为其余代码是什么样的?:)

于 2011-02-16T15:59:21.363 回答
1

这不是一个可以这样“解析”的输入,因为没有固定的关键字需要注意。但正则表达式似乎足以提取和拆分内容。

http://regular-expressions.info/有很好的介绍,https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world列出了一些有助于设计正则表达式的酷工具。

在您的情况下,您需要\d+匹配小数,从字面上使用定界符,您可能可以不用逗号定界符.*?分隔,来查找各个部分。也许:

preg_match('#(\d+/\d+) (\d+:\d+:\d+.\d+) (\w+) (.*?),(.*),(.*),...#');

如果属性的长度可变,那么您应该更喜欢两个正则表达式(尽管它可以在一个中完成)。首先获取.*每行的其余部分,然后将其拆分。

于 2011-02-16T16:02:10.820 回答
1

好的,在顶部跟进我的评论。

如果基于 TYPE_OF_EVENT 字段的日志格式是“恒定的”,那么您只需进行一些简单的预解析,之后就可以轻松完成其余的工作。

  1. 读一行
  2. 提取通用字段:时间戳、事件类型、源/目标
  3. 基于type_of_event,做进一步分析

    switch (event type) {
    case 'a': parse out 'a' event parameters
    case 'b': parse out 'b' event parameters
    default: log unknown event type for future analysis
    }

等等。

于 2011-02-16T16:18:56.317 回答
0

如何用“,”分隔符分割字符串并将所有内容放入数组中。这样,您将有一个数字索引来检查参数是否存在。

于 2011-02-16T15:59:29.080 回答