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

Posted

技术标签:

【中文标题】是否有描述平面文件的标准格式?【英文标题】:Is there a standard format for describing a flat file? 【发布时间】:2010-12-06 19:09:30 【问题描述】:

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

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

【问题讨论】:

我不知道谁刚刚否决了这个问题及其所有答案。这是一个非常有效的问题,有有用的答案。为我 +1。 我不确定我是否同意这些答案特别有用,因为大多数人甚至没有回答我提出的问题,但我不知道为什么这个问题会被否决:(跨度> 我没有投反对票,但每个回答者都误解了这个问题的事实证明这个问题写得不好。如果您想改进 SO,您应该编辑问题以使其有意义,而不是投票。 他的意图非常清楚。事实上,标题说明了他到底想要什么。 同意 Dour,如果不非常具体,您不太可能对如此庞大而复杂的问题得到很好的答案。该行业在处理这个问题时充满了灾难(想到 EDI)。 【参考方案1】:

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

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

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

关于描述平面文件格式:这可能很容易也可能很困难,具体取决于格式。尽管在大多数情况下存在更简单的解决方案,但通常可行的一种方法是将文件格式视为formal grammar,并为其编写lexer/parser。但我承认,那是相当重型机械。

如果你幸运的话,几个高级的regular expressions 可能会成功。但是,大多数格式都不适合。如果您打算自己编写词法分析器/解析器,我可以建议 PLY (Python Lex-Yacc)。但是存在许多其他解决方案,有许多不同的语言,其中很多比老式的Lex & Yacc 更方便。更多信息请见What parser generator do you recommend?


  :是的,这可能是轻描淡写。:即使恰当地描述email address format 也不是小事。

【讨论】:

【参考方案2】:

CSV

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


***上的 CSV 条目让我找到了 comparison of data serialization formats,这几乎就是您所要求的。

【讨论】:

数据序列化格式比较的好链接,谢谢!【参考方案3】:

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

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

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

请参阅XML vs comma delimited text files 以获取更多参考。

【讨论】:

我无法选择使用什么格式。客户以分隔、固定宽度或 XML 的形式提供平面文件。我必须从这些格式转到内部格式。使用 XML 很简单,只需使用 XSLT 转换。使用 delimited 相当简单,只需描述分隔符,然后构建一个 XML 文件,该文件可以应用 XSLT。固定宽度更难做,你必须描述每个字段的长度。我正在寻找一个可以描述固定宽度和分隔的平面文件的开放标准,因此我不必为该元数据创建自己的持久性 或者,您可以使用知道如何处理平面文件并将其转换为其他格式的工具。想到了 SSIS(SQL Server 集成服务)。【参考方案4】:

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

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

【讨论】:

嘿!这一个实际上回答了这个问题。我在较早的搜索中找到了 XFlat,但找不到关于谁拥有它的大量信息,如果它是一个真正的标准等。Unidex 还提供了获取 XFlat 描述和平面文件的工具,以便转换将其转换为 XML (unidex.com/xflat.htm)【参考方案5】:

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 对元数据进行编码。您可以轻松地将其应用于平面文件。

【讨论】:

【参考方案6】:

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

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

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

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于是否有描述平面文件的标准格式?的主要内容,如果未能解决你的问题,请参考以下文章

EDI的翻译软件

如何使用 bcp 从平面文件创建格式文件

相机校准期间的不同平面

SSIS:创建具有不同行格式的平面文件

SSIS 输出到平面文件为 0.00

如何将表格转换为平面文件,每个字段都在新行上