解析二进制文件和字符文件的语言

时间:2010-03-10 23:26:17

标签: language-agnostic programming-languages parsing

问题: 您有一些数据,您的程序需要指定输入。例如,数字的字符串。您正在寻找一种以您需要的格式转换原始数据的方法。 问题是:来源可以是任何东西。它可以是XML,属性列表,二进制文件 包含深深嵌入二进制垃圾中的所需数据。您的输出格式可能会有所不同 另外:它可以是数字字符串,浮点数,双打....

你不想编程。您需要一些例程,它们为您提供了能够以您希望的形式转换数据的命令。当然它包含正则表达式,但设计非常好,它提供的功能有时更容易,更强大。


此外:

许多用户都有这个问题,希望他们的程序可以转换,读取和写入其他来源提供的数据。如果它不能,它们注定要失败或使用像商业这样的程序 情报。那不是问题。 我说的是一个开发人员的工具,他知道自己在做什么,但是每次使用常规语言编写例程时,谁也不满意。一个专业的数据操作工具,如十六进制编辑器,正则表达式,vi,grep,解析器融合在一起 可以通过例程或REPL访问。

如果您拥有数据格式的规范,则可以立即访问和转换数据。无需调试或计划如何编程转换。我正在寻找解决方案,因为我不相信这个问题是新的。


它允许:

  • 加入/分组/合并结果
  • 插入/删除/发现/更换
  • 编写允许重复执行命令链的宏
  • 元分组(lists-> tables-> n维表)

示例(不,我不是在寻找解决方案,这只是一个例子): 您希望读取嵌入在具有可变长度记录的二进制文件中的xml字符串。您的 工具读取记录长度并删除文本周围的垃圾。现在它分开了 xml并提取字符串。作为印度数字字形并包含小数点逗号而不是小数点,您的工具将其转换为ASCII并用点替换逗号。现在结果必须存储到可变长度的矩阵中等。等

我正在寻找一种优秀的语言/语言设计,如果可能的话,还有一种实现。 您喜欢哪种设计,甚至如果不满足条件,您不想错过吗?

编辑:问题是问题的解决方案是否存在,如果存在,哪些实现可用。如果Quicksort,Mergesort和Heapsort可用,则不要实现自己的排序算法。你不要发明自己的文本解析 方法,如果你有正则表达式。如果OpenGL / Direct3D可用,您不要为图形创建自己的3D语言。现有解决方案或至少描述问题并提供建议的论文。并且有些人可能已经工作并经历过这样的问题,并且可以提出想法和建议。认为这个问题是全新的,我应该在没有背景的情况下自己解决并实现它 我必须承认,对我来说,知识似乎完全没有了。

更新: 不幸的是,由于我们的开发团队目前处于一个热门阶段,因此我没有多少时间来钻研这个主题。但我已经联系了TextTransformer的作者,他很友好地回答了我的问题 我在此期间调查了TextTransformer(http://www.texttransformer.de),到目前为止,我可以看到它提供了一个完整而有效的解决方案,如果您要解析字符数据。

对于任何试图实现良好解析语言的人来说,如果(!)它们足够强大,那么将任何输入数据直接转换为任何输出数据的最小运算符集似乎是:

  • 插入/删除:自我解释

  • 分组/取消分组:将输入数据拆分为一组标记并将它们组织成组 和超级组(数据结构,列表,表等)

  • 转换

    • 替代:更改代币的内容(特殊操作:替换)
    • 转置:更改令牌的顺序(交换,合并等)

5 个答案:

答案 0 :(得分:4)

您是否调查了TextTransformer

我没有这方面的经验,但听起来不错,作者在comp.compilers新闻组中发表了相当称职的帖子。

你还需要做一些编程工作。

答案 1 :(得分:3)

对于程序员,我建议:

Perl针对SQL后端。

对于非程序员来说,你正在寻找的是某种business intelligence套件。

答案 2 :(得分:3)

这个建议可能会过多地扩大你的搜索范围......但这里是:

您可以重用,原样或以其他方式从SnapLogic框架的[开源]代码中获取“灵感”。

编辑(回答有关SnapLogic文档的评论等) 我同意,SnapLogic文档有一些不足之处,特别是对于您所处情况的人,即只是想快速获取SnapLogic可以执行的概述,以及它是否通常会满足他们的需求需要,没有投入太多时间,认真学习系统 此外,我意识到SnapLogic的范围和典型用途在某种程度上与问题中表达的要求不同,我应该花时间更好地阐明可能的连接。
所以这里......

SnapLogic的一个显着且强大的功能是它能够[无形地]无代码地创建“ 管道 ”,即由预先构建的组件制作的流程;    SnapLogic框架提供了满足一般数据集成任务最常见需求的组件。例如,有

的组件
  • 以CSV或XML或固定长度格式读入和/或写入文件
  • 连接到各种SQL后端(用于输入,输出或两者)
  • 转换/格式化[易于解析]数据字段
  • 排序记录
  • 连接查找和一般“非规范化”记录构建的记录(类似于SQL连接,但适用于任何[可合理大小的输入])
  • 合并来源
  • 过滤来源中的记录(选择并在以后的步骤中仅使用属性“State”等于“NY”的记录)
  • 有关详细信息,请参阅此list of available components

SnapLogic的功能相对较弱(针对OP的描述目的)与解析有关。标准组件只会读取通用文件格式(XML,RSS,CSV,固定Len,DBMS ......),因此结构化(或半结构化?)文件,如问题中描述的文件,混合二进制文本和文本等等不太可能成为标准组件 因此,您需要在Python或Java中编写自己的解析逻辑,当然要尊重SnapLogic API,以便以后模块可以与其他模块“玩得很好”。
顺便说一下,解析所描述文件的任务可以通过两种方式之一完成,使用“单片”读取器组件(即接收整个文件并生成易于分析的记录数组的组件),或者使用多组件方法,输入组件读入并解析文件的“记录”级别(或线级或块级别,无论这可能是什么),其他标准或自定义SnapLogic组件用于创建管道它有效地表达了将记录(或块或......)解析为其各个字段/属性的逻辑 第二种方法当然是更模块化的,并且如果目标是处理许多不同的文件格式,则可能是适用的,其中每种新格式需要拼凑组件而没有编码或很少编码。无论用于输入/解析文件的方法是什么,SnapLogic框架仍然可用于创建管道,然后以各种方式处理解析的输入。

因此,我对这个问题的理解促使我建议将SnapLogic作为手头问题的可能框架,因为我理解了奇数格式文件的“无代码”解析功能方面的差距,但也看到了一些功能的共性关于创建各种加工管道 由于可能存在功能差距,而且由于SnapLogic产品相对缺乏成熟度及其明显的商业/开放性,我也提出了我的建议,其表达方式类似于“激励自己”。来源矛盾 (注意:这个陈述既不是对框架本身的技术成熟度/价值的批评,也不是对面向业务的开源使用的批评,而是对业务/商业压力可能影响开源的警告。提供各种方向)

总结
根据问题中表达的愿景的具体细节,SnapLogic可能值得考虑,只要理解“ some-assembly-required ”将适用,特别是在文件解析方面,并且产品的具体形状和性质可能会发展(但它又是开源的,因此可以根据需要将其冻结或弯曲)。
更通用的说法是,SnapLogic基于 Python,这是一种非常流行的语言,用于编码各种连接器,转换逻辑等。

答案 3 :(得分:2)

在回复Paul Nathan时,你曾提到过一次性写代码是一件令人不快的事。我不明白为什么会这样。毕竟,无论我们编写多么完美的代码,我们所有的代码都将被抛弃并最终被替换。所以我的意见是,写一次性代码非常好,如果你不花太多时间写它。

因此,似乎有两种方法可以解决您的解决方案:a)找到一些专门用于此目的的工具(解析数据,对其执行一些基本操作并将其存储在某些特定结构中)或b)使用一些通用语言,有很多库,并且自己编写代码。

我不认为方法a)是可行的,因为迟早你会遇到工具未涵盖的障碍,你会花时间和神经攻击工具,或邮寄作者并等待他们实现你所需要的。我可能也错了,所以如果你找到一个完美的工具,请放在这里一个链接(我自己在我的日常工作中做了大量的数据处理,我不能发誓我不能更有效地做到这一点)。

方法b)可能起初看起来“不愉快”,但是给出了一个很好的高级表达语言和一堆有用的库(正则表达式,XML操作,创建解析器......)它应该不会太难,并且可能为了这个目的,逐渐变成DSL。除了已经提到的Perl之外,Python和Ruby听起来像这些语言的好候选者(我也打赌一些Lisp派生词,但我没有经验)。

答案 4 :(得分:1)

如果你为正在解析的内容定义正式语法,你可能会发现AntlrWorks很有用。