我正在处理将解析日志文件的任务。在Java中解析以下日志字符串的最佳方法是什么?
EMPLOYER : NAME : Company ID : 23 TYPE : Academy
FOUNDED : 2012-01-05 11:01:18.658 CATEGORY : College
EMPLOYEE : NAME : John TIN : 123456
GENDER : Male STATUS : Prob
COMMENT : Data sent to 192.168.0.1:8088
USER DATA : Any string.
我特别关注关键字“雇主”和“员工”(我不需要)以及出现在“成立”和“评论”字段中的冒号(如果我将使用的话)冒号作为分隔符。)
谢谢!
答案 0 :(得分:2)
没有任何最佳方法可以做到这一点。它显然是一种 ad hoc 格式,没有系统的元结构(例如与XML形成对比......)
你可以尝试正则表达式,但我担心它们会变得过于复杂。
您可以使用解析器生成器,但这可能超出了您当前的功能。 (否则你自己会有这个。)
相反,我建议使用Java的Scanner
类来实现解析器。上下文敏感分隔符的问题可以通过更改分隔符正则表达式来解决,具体取决于您期望接下来的内容,或者使用Scanner.nextLine()
来获取行的其余部分,而不考虑分隔符。
这类问题的一个问题是您没有明确定义的格式。相反,你刚刚向我们展示了一个简单的例子。此示例可能是典型,但它不处理边缘情况。 (您已经确定了其中至少一个。)这也提出了在不将“业务知识”嵌入解析器的情况下无法解析日志文件条目的可能性;例如日期将始终采用某种格式,或者公司名称永远不会包含冒号。如果你实际上并不知道这些规则是什么(例如因为它们没有在任何地方正确指定)那么你的解析器就会很脆弱。