解析文本的最快/最简单的方法

时间:2015-04-09 22:00:24

标签: java text-parsing

我正在尝试解析一些文本,我正在寻找最快/最简单的解决方案。我已经尝试过使用正则表达式了,但是Java正在使用它......

这是我要解析的文本的结构:

*****************
ID: 1234567  // 7 digit uuid
mistakes: There may be some mistakes here, or there may not be any mistakes  //optional
mistake type: mistake background // "YES" or "NO"
report: <xml><item>blah, blah</item></xml> 

*****************

实际上文件可能看起来像这样:

*****************
ID: 1234567
mistakes: 
NO: happened on the playground
report: <xml><item>black eye when playing basketball</item><reason>elbow</reason></xml> 

*****************

*****************
ID: 1234568
mistakes: Teacher was not watching students at the time of incident
YES: teacher turned her back after seeing an altercation
report: <xml><item>fight</item><reason>None</reason></xml> 

*****************

*****************
ID: 1234569
mistakes:
NO
report: <xml><item>Child needed band-aid</item><reason>scrape</reason></xml> 

*****************

*****************
ID: 1234570
mistakes:
NO
report: <xml><item>Child needed tissue</item><reason>runny nose</reason></xml> 

*****************
...
...

我试图将'密钥'(ID,错误,错误类型,报告)放入Map以进行进一步的聚合和处理。

我尝试过使用正则表达式并且收效甚微,但客户端不断更改报表结构并抛弃整个模式。我正在寻找可能更容易维护的东西。在过去,我有一个简单的时间对这样的数据进行xsl转换,但是这不是纯xml,我不知道Java是否会抛出或不给出当前格式。我已经问过客户他们是否愿意改变格式,但是他们对此并不感兴趣。

任何人都有任何关于如何使这种解析更容易维护的想法?

谢谢!


编辑:

我没有正则表达式,但这是它的要点

ID:\s*(\\d{7}).*mistakes:\s*(\\d*).*mistake type:\s*(\\d*).*report:\s*(.*)

4 个答案:

答案 0 :(得分:0)

我还无法对帖子发表评论,这就是为什么我会将此作为答案。如果你有一个固定数量的字段,你可以逐行阅读,并在你的行开始后只写6行(&#34; ^ \。*&#34;)。然后,您将继续使用类似的逻辑将它们存储在地图中。如果它开始与(&#34; ^错误:&#34;)你存储剥离后剩下的东西&#34;:错误&#34;作为一种价值。

答案 1 :(得分:0)

您可以尝试使用常规字符串操作。例如,对于包含

的行

ID:1234567

这样的东西
if (line.startsWith("ID:")
{
    String id = line.subString(3).trim();
}

显然,请事先检查该行是否为空/空。我相信它会更快。

另请参阅此博客文章Performance Comparison: Regex versus string operations

答案 2 :(得分:0)

我想我会继续使用带有readline扭曲的正则表达式。

我将我的正则表达式更改为"\\*{17}.*\\*{17}",一旦我按照&#39; *&#39;将它们分组,我可以逐行将它们读入我的地图中他们的身份证。

答案 3 :(得分:-2)

如果您使用的是java,为什么不尝试将此文件作为属性文件加载。然后你可以使用propFile.getProperty(“key”)来读取它。这样您可能不需要地图,或者即使您需要地图,也可以使用propFile.propertyNames()使用enumertion并将其放在地图中。