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

15

是否有一种标准或开放格式可用于描述扁平文件的格式?我的公司集成了许多不同的客户文件格式。使用XML文件可以轻松获取或创建XSD来描述XML文件格式。我在寻找类似的方法来描述扁平文件格式(固定宽度、分隔等)。Stylus Studio使用专有的 .conv 格式来实现此功能。该 .conv 格式可以在运行时将任意扁平文件转换为XML文件。我只是想知道是否有任何更加开放或基于标准的方法来完成相同的事情。

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


5
我不知道谁刚刚投票将这个问题及其所有答案投下。这是一个完全有效的问题,并且有帮助的答案。让我给你点赞。 - Christian Hayter
2
我不确定我同意答案是否特别有帮助,因为大多数甚至没有回答我所提出的问题,但我不知道为什么问题会被投票否决 :( - Stimy
2
我没有对任何答案进行投票,但每个回答者都误解了问题,这表明问题写得很糟糕。如果你想改进SO,你应该编辑问题使其有意义,而不是投票支持它。 - Dour High Arch
1
@Stimy - 我不同意。你最初的问题是以“是否有标准或开放格式可用于描述平面文件的格式”开头的。CSV完全符合要求(提示:这就是为什么3个人同时给出了这个答案)。后来,你编辑了你的问题,使其更具体(同时保留了第一句话,让我认为你想要“一个”标准),但直到你可能对所有回答进行了负面评价之后才这样做。顺便说一句,我没有对你的问题进行负面评价。 - Jay Riggs
2
同意Dour的观点,如果不具体说明,你很难得到一个好的解答,因为这是一个庞大而复杂的问题。业界充斥着处理这个问题的灾难(EDI就是一个例子)。 - Dana the Sane
显示剩余4条评论
7个回答

7

嘿!这个回答了问题。我在之前的搜索中找到了XFlat,但是找不到关于它的所有权以及它是否是真正的标准的太多信息。Unidex还提供了工具,可以将XFlat描述和平面文件转换为XML(http://www.unidex.com/xflat.htm)。 - Stimy

3
关于选择现有的平面文件格式: 有逗号分隔值(CSV)格式。或者更普遍的DSV。但这些都不是“定长”的,因为有一个分隔符字符(例如逗号)来分隔单个单元格。请注意,尽管CSV已经标准化,但并不是每个人都遵循标准。此外,CSV可能对您的目的过于简单,因为它不允许丰富的文档结构。
在这方面,标准化且仅略微复杂(但因此更有用)的格式JSONYAML是更好的选择。两种格式都被许多语言支持。
你最好查看此概述中列出的所有非二进制语言,然后确定哪种最适合你。
关于描述平面文件格式:这可能很容易或很难,具体取决于格式。虽然在大多数情况下存在更简单的解决方案,但一种通用的方法是将文件格式视为形式语法,并为其编写词法分析器/语法分析器。但我承认,那是相当复杂的机器。
如果你很幸运,一些高级的正则表达式可能会解决问题。然而,大多数格式并不适合这种方法。 如果你打算自己编写词法分析器/语法分析器,我可以建议使用PLY(Python Lex-Yacc)。但是,还有许多其他解决方案,涉及许多不同的编程语言,其中很多比传统的Lex & Yacc更方便。更多信息请参见你推荐哪个解析器生成器?

†:是的,这可能是一种轻描淡写的说法。
‡:即使是正确描述电子邮件地址格式也并不容易。


2
COBOL(不管你喜不喜欢)有一种标准格式,用于描述文件中的固定宽度记录格式。
然而,其他文件格式要简单得多。例如,CSV文件只是一个字符串列表。通常,CSV文件的第一行是列名,那就是描述。
有使用JSON来制定文本文件元数据的示例。这可以应用于JSON文件、CSV文件和固定格式文件。
看看IBM的sMash(Project Zero)使用JSON编码元数据的http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.resource/declaration.html
您可以轻松地将此应用于平面文件。

1

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

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

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

请参见XML vs comma delimited text files以获取进一步的参考。


1
我没有选择使用哪种格式。客户提供的是分隔符、固定宽度或XML形式的平面文件。我必须将这些格式转换为内部格式。使用XML很简单,只需使用XSLT转换即可。使用分隔符也相对简单,只需描述分隔符,然后构建一个可以应用XSLT的XML文件。使用固定宽度更加困难,您必须描述每个字段的长度。我正在寻找一种开放标准,可以描述固定宽度和分隔符平面文件,以便我不必为该元数据创建自己的持久性。 - Stimy
或者,您可以使用一个知道如何操作平面文件并将它们转换为其他格式的工具。SSIS(SQL Server Integration Services)是一个不错的选择。 - John Saunders

1

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

话虽如此,还是要看看Flatworm,一个谦卑的平面文件解析器。 我用它来解析位置和/或CSV文件,并喜欢它的XML描述符格式。 它可能比SWIFT更好:)


0

CSV

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


维基百科上的CSV条目让我找到了一个数据序列化格式比较,几乎就是你所要求的。


数据序列化格式比较的链接很不错,谢谢! - Francis Upton IV

0

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

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

我不确定它是否真的算作一种声明式语言,因为它是基于插件解析器的,但它似乎可以工作,并且是可扩展的,这可能完全符合您的需求。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接