14

是否有可用于描述平面文件格式的标准或开放格式。我的公司集成了许多不同的客户文件格式。使用 XML 文件,很容易获得或创建 XSD 来描述 XML 文件格式。我正在寻找类似的东西来描述平面文件格式(固定宽度、分隔等)。Stylus Studio 使用专有的 .conv 格式来执行此操作。该 .conv 格式可在运行时用于将任意平面文件转换为 XML 文件。我只是想知道是否有更多的开放或基于标准的方法来做同样的事情。

我正在寻找一种描述各种平面文件格式的方法,无论它们是固定宽度还是定界,所以 CSV 不是这个问题的答案。

4

7 回答 7

7

XFlat: http: //www.infoloom.com/gcaconfs/WEB/philadelphia99/lyons.HTM#N29 http://www.unidex.com/overview.htm

对于复杂的情况(例如日志文件),您可以考虑使用词法解析器。

于 2009-10-14T19:22:36.460 回答
3

关于选择现有的平面文件格式:逗号分隔值(CSV) 格式。或者,更一般地说,DSV。但这些不是“固定宽度”,因为有一个分隔符(例如逗号)分隔各个单元格。请注意,尽管 CSV 是标准化的,但并非所有人都遵守该标准。此外,对于您的目的,CSV 可能很简单,因为它不允许丰富的文档结构。

在这方面,标准化且稍微复杂(但因此更有用)的格式JSONYAML是更好的选择。两种语言都支持开箱即用。

最好的办法是查看本概述中列为非二进制的所有语言,然后确定最适合您的语言。

关于描述平面文件格式:这可能非常容易或困难,具体取决于格式。尽管在大多数情况下存在更简单的解决方案,但通常可行的一种方法是将文件格式视为正式语法,并为其编写词法分析器/解析器。但我承认,那是相当†</sup> 重型机械。

如果幸运的话,几个高级正则表达式可能会成功。然而,大多数格式都不适合这一点。‡</sup> 如果您打算自己编写词法分析器/解析器,我可以建议PLY (Python Lex-Yacc)。但是存在许多其他解决方案,有许多不同的语言,其中很多比老式的Lex 和 Yacc更方便。有关更多信息,请参阅您推荐什么解析器生成器?


  †</sup>:是的,这可能是轻描淡写。
  ‡</sup>:即使正确地描述电子邮件地址格式也并非易事。

于 2009-10-14T18:55:26.083 回答
2

COBOL(不管你喜欢与否)有一个标准格式来描述文件中的固定宽度记录格式。

然而,其他文件格式更容易描述。例如,CSV 文件只是一个字符串列表。通常 CSV 文件的第一行是列名——这就是描述。

有使用 JSON 为文本文件制定元数据的示例。这可以应用于 JSON 文件、CSV 文件和固定格式文件。

看看http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.resource/declaration.html

这是 IBM 的 sMash(零项目),使用 JSON 对元数据进行编码。您可以轻松地将其应用于平面文件。

于 2009-10-14T19:27:18.367 回答
1

归根结底,您可能必须定义自己的文件标准,专门满足您的存储需求。我建议使用 xml、YAML 或 JSON 作为您收到的所有文件类型的内部容器。最重要的是,您必须实现一些额外的验证逻辑来​​维护元数据,例如固定宽度文件的列大小(用于从固定宽度导入和导出)。或者,您可以将一组元数据存储或链接到您转换为内部格式的每个文件。

那里可能有一个标准,但很难为这些问题创建“一刀切”的解决方案。有实体关系管理工具(Talend 等)可以更轻松地创建这些映射,但您仍然需要花费大量时间来维护文件格式定义和规则。

至于强制列宽,xml 可能是最好的解决方案,因为您可以使用 xml 模式描述格式(有长度限制)。对于 YAML 或 JSON,您可能必须为此编写自己的逻辑,尽管我确信其他人已经提出了解决方案。

请参阅XML 与逗号分隔的文本文件以供进一步参考。

于 2009-10-14T19:05:14.317 回答
1

我不知道是否有任何标准或开放格式来描述平面文件格式。但有一个行业做到了这一点:银行业。金融机构确实在一个名为SWIFT的专用网络上使用标准化消息进行通信。SWIFT 消息最初是定位的(在 SWIFTML 之前,XML 化版本)。我不知道这是否是一个好建议,因为它有点晦涩难懂,但也许你可以看看SWIFT 格式化指南,它可能会给你一些想法。

话虽如此,请查看Flatworm,一个不起眼的平面文件解析器。我用它来解析位置和/或 CSV 文件,并且喜欢它的 XML 描述符格式。这可能是比 SWIFT 更好的建议 :)

于 2009-10-14T20:12:37.847 回答
0

CSV

CSV 是一种分隔数据格式,其字段/列由逗号分隔,记录/行由换行符分隔。包含特殊字符(逗号、换行符或双引号)的字段必须用双引号引起来。但是,如果一行包含一个空字符串条目,则它可以用双引号引起来。如果字段的值包含双引号字符,则通过在其旁边放置另一个双引号字符来对其进行转义。CSV 文件格式不需要特定的字符编码、字节顺序或行终止符格式。


维基百科上的 CSV 条目允许我找到数据序列化格式的比较,这几乎是您所要求的。

于 2009-10-14T18:55:42.380 回答
0

我知道的唯一类似的东西是 Hachoir,它目前可以解析 70 种文件格式:

http://bitbucket.org/haypo/hachoir/wiki/Home

我不确定它是否真的算作一种声明性语言,因为它是基于插件解析器的,但它似乎可以工作,并且是可扩展的,可以很好地满足您的需求。

顺便说一句,有一些有趣的标准化、可扩展的平面文件格式,例如 IFF(交换文件格式)。

于 2009-10-14T19:51:48.030 回答