【问题标题】:Validate Format Tricky File Using Java使用 Java 验证格式棘手的文件
【发布时间】:2013-04-15 12:57:54
【问题描述】:

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

文件基本上是这种格式:

   \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) 我需要将文件中的每个条目转换为客户端对象。我应该在将整个文件转换为 Java 对象之前对其进行验证吗?或者我应该在继续将其条目转换为 Java 对象时验证该文件吗? (请记住,如果任何客户端条目无效,处理将立即停止并引发异常 - 因此创建的任何对象都将被丢弃)。

我非常希望看到您对问题 1 的建议。问题 #2 更让我好奇你将如何处理这种情况。如果愿意,请忽略 #2,但请回答 #1 =)

有谁知道任何框架可以帮助我顺便处理文件?

谢谢。

更新:

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

干杯。

【问题讨论】:

  • 对于您的第一个问题,这里有类似的内容:stackoverflow.com/questions/8659698/…。有关性能问题,请参阅答案的编辑。
  • 感谢您的回答。我以前见过这个问题,这个问题和我的很相似,但我不确定正则表达式是否是解决这个问题的最佳方法。整个文件中可能有很多“\n”,每个客户端条目的 cmet 数量和可选 ID 的数量不同 - 因此正则表达式必须非常复杂。这就是为什么我在问题 #1 中提到将每个条目转换为一行的原因,因为这种方式更容易创建一个正则表达式来验证......然而,这个解决方案在我的耳朵里听起来不是很优雅:( 渴望听到任何其他的输入。干杯。

标签: java parsing validation


【解决方案1】:

如果您打算在发现任何部分无效的情况下使批处理失败,请先验证文件。

有几个优点。一是验证和处理不必同步。例如,如果您每天处理批次,但全天都接收文件,您可以全天验证它们并在计划处理之前通知纠正问题。另一个是验证文件是否格式正确的速度非常快。

一个简短的 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

【讨论】:

  • 我应该注意,这种验证也可以在 Java 中以几乎相同的方式完成......但如果处理和验证彼此独立,那么脚本语言可能更方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2020-06-10
  • 2019-05-29
相关资源
最近更新 更多