使用Java验证格式棘手文件

时间:2013-04-15 02:24:00

标签: java parsing validation

我需要解析并验证格式有点棘手的文件。

基本上文件的格式为:

   \n -- just to make clear it may have empty lines
   CLIENT_ID
   A_NUMERIC_VALUE
   ONE_LINE_OF_SOME_RANDOM_COMMENT_ABOUT_THE_CLIENT
   ANOTHER_LINE_OF_SOME_RADOM_COMMENT_ABOUT_THE_CLIENT
   \n
   \n
   CLIENT_ID_2
   A_NUMERIC_VALUE_2
   ONE_LINE_OF_SOME_RANDOM_COMMENT_ABOUT_THE_CLIENT_2
   ANOTHER_LINE_OF_SOME_RADOM_COMMENT_ABOUT_THE_CLIENT_2
   OHH_THIS_ONE_HAS_THREE_LINES_OF_COMMENTS

文件很少很大(10 mb可能是我见过的最大文件 - 通常它们大约有900kb-1mb)。

所以我有两个问题:

1)如何有效验证文件的格式?使用正则表达式+扫描仪? (如果我可以将每个客户端条目转换为只有一个字符串,我认为这个是一个非常可行的选项 - 所以我可以在它上面应用正则表达式。)

2)我需要将文件中的每个条目转换为Client对象。我应该在将整个文件转换为Java对象之前验证它吗?或者我应该在将其条目转换为Java对象时验证该文件? (请记住,如果任何客户端条目无效,则处理立即停止并抛出异常 - 因此将丢弃所创建的任何对象。)

我真的很想看到你对问题#1的建议。问题#2更像是我对如何处理这种情况的好奇心。如果愿意,请忽略#2,但请回答#1 =)

有没有人知道任何框架可以帮助我处理文件?

感谢。

更新

我看到了question,问题与我的问题非常相似,但我不确定正则表达式是否是解决此问题的最佳方法。可能会有相当多的&#34; \ n&#34;在整个文件中,每个客户端条目的注释数量和可选ID都不同 - 因此正则表达式必须非常复杂。这就是为什么我提到在问题#1中将每个条目转换为一行的原因,因为这样可以更容易地创建一个正则表达式来验证......然而,这个解决方案对我来说听起来并不优雅:( < / p>

干杯。

1 个答案:

答案 0 :(得分:0)

如果您发现任何部件无效,您打算使批次失败,请先验证该文件。

有几个优点。一个是验证和处理不需要是同步的。例如,如果您每天处理批次,但在一天中接收文件,则可以在一天内对其进行验证,并在计划处理之前通知纠正问题。另一个是验证文件是否格式正确非常快。

一个简短的perl脚本肯定能完成这项工作。如果我正确理解了模式,则无需转换数据,而且这些都是预读的。

read past any newlines
read and validate a client id
read and validate a numeric value
read and validate one or more comments until a blank line is found
repeat the above four steps until EOF or invalid data detected