是否有描述平面文件的标准格式?

时间:2009-10-14 18:53:08

标签: transformation flat-file delimited-text

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

我正在寻找一种描述各种平面文件格式的方法,无论它们是固定宽度还是分隔,因此CSV不能解决这个问题。

7 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

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

您最好的选择是查看this overview中列为非二进制文件的所有语言,然后确定最适合您的语言。

关于描述平面文件格式:这可能非常简单或困难,具体取决于格式。虽然在大多数情况下存在更简单的解决方案,但一般来说,一种方法是将文件格式视为formal grammar,并为其编写lexer / parser。但我承认,那是重型机械。

如果你很幸运,可以选择一些高级regular expressions。然而,大多数格式都不适用于此。如果您打算自己编写词法分析器/解析器,我可以建议PLY(Python Lex-Yacc)。但是,在许多不同语言中存在许多其他解决方案,其中许多解决方案比老式Lex & Yacc更方便。有关更多信息,请参阅What parser generator do you recommend?


:是的,这可能是轻描淡写 :即使正确地描述email address format也不是一件容易的事。

答案 2 :(得分:2)

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

然而,其他文件格式的描述更为简单。例如,CSV文件只是一个字符串列表。通常,CSV文件的第一行是列名称 - 即描述。

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

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

这是IBM使用JSON编码元数据的sMash(Project Zero)。您可以轻松地将其应用于平面文件。

答案 3 :(得分:1)

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

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

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

有关详细信息,请参阅XML vs comma delimited text files

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

CSV

  

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


维基百科上的CSV条目让我找到了comparison of data serialization formats,这几乎就是你所要求的。

答案 6 :(得分:0)

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

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

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

另外,有一些有趣的标准化,可扩展的平面文件格式,例如IFF(交换文件格式)。