验证格式使用Java的棘手文件

问题描述:

我需要分析和验证格式有点棘手的文件。验证格式使用Java的棘手文件

基本上文件来自格式如下:

\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对象时验证文件? (请记住,如果任何客户端条目无效,则处理立即停止并抛出异常 - 因此,任何创建的对象都将被丢弃)。

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

有没有人知道任何框架来帮助我处理文件的方式?

谢谢。

更新:

我看到这个question和问题非常类似地雷,但我不知道是否正则表达式是最好的出路这个问题。在整个文件中可能会有很多“\ n”,每个客户端条目的注释数量不同以及一个可选ID - 因此,正则表达式必须非常复杂。这就是为什么我提到将每个条目转换成问题#1中的一行,因为这种方式会更容易创建一个正则表达式来验证......不过,这个解决方案听起来并不是很优雅:(

干杯。

+0

为你的第一个问题,这里有类似的东西:http://*.com/questions/8659698/txt-file-format-validation-in-java。有关性能问题,请参阅答案的编辑。 –

+0

感谢您的回答。我之前看过这个问题,问题与我的问题非常相似,但我不确定正则表达式是否是解决此问题的最佳方法。在整个文件中可能会有很多“\ n”,每个客户端条目的注释数量不同以及一个可选ID - 因此,正则表达式必须非常复杂。这就是为什么我提到在问题#1中将每个条目转换成一行的原因,因为这种方式会更容易创建一个正则表达式来验证......不过,这个解决方案对我的耳朵听起来不太优雅:(渴望听到任何其他输入。干杯 – cldjr

如果您打算,如果任何部分被发现无效失败批次,然后验证文件第一。

有几个好处,其中之一是验证和处理不一定是同步的。如果,例如,您每天处理批次,但全天接收文件,您可以在一天中验证它们,并在计划处理之前通知您纠正问题;另一个是验证wh以太网文件格式良好非常快。

简短而简单的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 
+0

我应该注意到,这种验证也可以用Java以同样的方式完成......但是如果处理和验证彼此独立,那么脚本语言可能会更方便。 – phatfingers