【问题标题】:Java Parsing Framework for complex CSV files用于复杂 CSV 文件的 Java 解析框架
【发布时间】:2011-10-05 02:27:18
【问题描述】:

我需要将复杂(非固定长度)的 csv 文件解析为 Java 对象,以便比较其值。 我首先尝试了 Flatform Parsing Framework,我喜欢在额外的 (xml) 文档中描述值的方法。也许它是简单 csv(以及平面)文件的正确工具。然而,我的 csv 文件包含字段数量不同的行 - 有时它们跨越多行。这些字段之间也存在依赖关系。

这里有一个小例子:(每种类型都有一定数量的额外参数)

    ; <COMMENTS (to be ignored)>
    <NAME>,<TYPE_A>,<DESCRIPTION>,<PARAMETER>
    <NAME>,<TYPE_B>,<DESCRIPTION>,<PARAMETER>,<PARAMETER>
    <NAME>,<TYPE_C>,<DESCRIPTION>,<PARAMETER>,<PARAMETER>,<PARAMETER>,<PARAMETER>
    <NAME>,<TYPE_D>,<DESCRIPTION>,<PARAMETER>,<PARAMETER>,<PARAMETER>,<PARAMETER>, -
                              <PARAMETER>,<PARAMETER>, -
                              <PARAMETER>,<PARAMETER>
    <NAME>,<TYPE_B>,<DESCRIPTION>,<PARAMETER>,<PARAMETER>
    <NAME>,<TYPE_A>,<DESCRIPTION>,<PARAMETER>

所以我需要一些东西来以更复杂的方式描述和解析 csv 文件。我是新手,我听说过解析器生成器 - 这是我需要的吗?

【问题讨论】:

  • 有完整的 java 解析器框架(实际上,这是一个很大的轻描淡写,但适合这里) - 看看antlr.org
  • 我的同事曾经为 boost.spirit 框架 (C++) 编写语法。我需要检查 Java 等价物。 ANTLR 似乎是一个绝佳的机会——我猜这很复杂。
  • 你有 - 作为行延续和 cmets 的事实,使它不适合 CSV 解析器。您必须重写现有的 CSV 解析器来解释它们,在这种情况下,我只需编写一个小语法并让 JavaCC 或 ANTLR 生成解析器。
  • @Bart:你对 ANTLR 有经验吗?是否有任何示例如何将文本解析为 Java 对象?
  • @mamuesstack,是的,我对 ANTLR 了解一些。您能否编辑您的原始问题并解释一下您要创建的对象类型?每行有不同数量的&lt;PARAMETER&gt;s 是不同的对象吗?

标签: java csv text-parsing


【解决方案1】:

一种选择是使用 Scanner 类,或者您可能想查看 Spring Batch。我从未真正使用过 SB,但考虑到批处理作业通常从简单的文本文件中读取,我相信我读到它可以满足这一点,包括各种对象映射。

【讨论】:

  • 最后,我使用 Scanner 类和一些 RegExp 创建了自己的解决方案。谢谢!
【解决方案2】:

试试OpenCSV(见http://opencsv.sourceforge.net/#what-features)。它可以很好地处理嵌入式回车。

【讨论】:

  • hmm,文档不好,只有一些标准示例。多行的解析工作正常。但我想我的 csv 文件差异很大,我还需要检查解析器生成器(例如 ANTLR)
  • 我很好奇:为什么您需要解析器生成器?我的意思是,我理解你是否想要一个解析器生成器,但 NEED 是一个强词。它们是 CSV 文件。它们是由某些程序生成的。该程序的功能是有限制的(我认为它是一个理智的程序)。
  • 这只是关于 CSV 值的多样性。需要如何处理单行也有例外。例如,使用 OpenCSV,我不知道如何识别跨越多行且在(示例的第 5 行)之间带有“-”(减号)的字段。一个字段总是由 ',' 封闭,整个字段由 CR 设置。如前所述:文档没有那么有用
  • @Femi,我快速浏览了 OpenCSV,但无法找到解释注释行 (; ... \n) 或表明应将 - \n 视为行延续的方法。 AFAIK,此输入不是 CSV。
【解决方案3】:

你也可以试试japaki

【讨论】:

  • Japaki 听起来很有趣。我最终使用了 Scanner 类和适当的 RegExps 来解析文件。下次,我一定要试试 Japaki
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 2013-02-19
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
相关资源
最近更新 更多