2011-02-16 127 views
0

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

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

在另一个场合中,字符串可以有一系列的参数,其中多达27一路,其他有16通过文档阅读,有参数中的一些逻辑,例如,第17个参数将始终保存一个整数。虽然这很好,但不幸的是,第17个参数可能是字符串中的第7个参数。对每个字符串唯一不变的是时间戳和第6个第一个参数。

我该如何解决像这样的字符串?如果我的问题有点不清楚,我很抱歉,我发现很难说出我的问题。

+1

在字符串的其余部分有什么“固定的”,可以让你找出有多少参数。例如是依赖于TYPE_OF_EVENT字段的参数的数量? – 2011-02-16 16:01:50

+0

任何代码给我们看?由于你的字符串总是以相同的(时间戳和6个参数)开头,所以你应该从那开始。 – soju 2011-02-16 16:07:47

+0

@Marc是的,这些参数是在TYPE_OF_EVENT的基础上添加的,源和标志(对于目标是同等的)是唯一保证字段。根据事件添加更多参数后。 – 2011-02-16 16:09:28

回答

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
    }

等等。

1

我会用不同的记录解决方案,或找到一种方法,让你有空的占位符,项目等,从而修改项目3 ,,, ITEM6等

只是我认为没有太多了解这个应用程序 - 这个应用程序听起来不太好。我通常通过这样的因素来判断应用程序,如果没有很好的理由让日志文件非标准化,那么你认为剩下的代码是什么样的? :)

+1

XML也是一个很好的选择。 – Tim 2011-02-16 16:00:49

0

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

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+) (.*?),(.*),(.*),...#'); 

如果有属性的变长,那么你应该更喜欢2个正则表达式(尽管它可以在一个完成)。首先得到每行剩余的.*,然后再分割。