【发布时间】:2014-01-12 03:44:42
【问题描述】:
总结和基本问题
使用 MS Access 2010 和 VBA(叹息..)
我正在尝试实现一个专门的 Diff 函数,该函数能够根据已更改的内容以不同的方式输出更改列表。我需要能够生成一份简明的更改列表,以提交我们的记录。
我想使用诸如<span class="references">These are references 1, 6</span> 之类的html 标签,以便我可以使用代码查看更改并自定义更改文本的输出方式。或者其他任何可以完成我的任务的东西。
我认为这是一种提供可扩展方式来自定义输出的方法,并可能将事物转移到更强大的平台并实际使用 html/css。
有谁知道类似的项目可以为我指明正确的方向吗?
我的任务
我有一个带有工作操作指令表的访问数据库 - 通常有 200-300 个操作,其中许多操作从一个版本更改为另一个版本。我目前已经实现了一个函数,它遍历表,查找已更改的指令并进行比较。
请注意,每条操作指令通常是几句话,末尾有几行,并带有一些文档参考。
我的算法基于"An O(ND) Difference Algorithm and Its Variations",效果很好。
Access 支持“富”文本,它只是美化了简单的 html,因此我可以轻松地生成带有格式化添加和删除的全文,即添加像 <font color = "red"><strong><i>This text has been removed</i></strong></font> 这样的标签。 Diff 过程的主要输出是操作的全文,其中包括彼此内联的未更改、删除和插入的文本。 diff 过程添加了<del> 和<ins> 标记,这些标记稍后会替换为格式化文本(结果类似于堆栈交换编辑的更改视图)。
但是,正如我所说,我需要以人类可读格式列出的更改。事实证明,这很困难,因为许多更改会产生歧义。
例如:如果一种化学品正在从“A类”更改为“C类”,那么容易生成的更改文本是“将'A'更改为'C'”,这对于审查更改的人。更常见的是末尾的文档引用:将 SOP 3 添加到列表中,例如“SOP 1, 2, 3”会生成文本“Add '3'”。显然也没有用。
最有用的是指定为“SOP”文本的文本的自定义输出,以便输出为“添加对 SOP 3 的引用”。
我从以下解决方案开始:
将单词组合在一起,例如将诸如“SOP 1、2、3”之类的文本作为一个标记进行比较。这会生成文本“将 'SOP 1, 2' 更改为 'SOP 1, 2, 3”。当列表很大并且您试图确定实际更改的内容时,这会变得混乱。
我现在在哪里
我现在尝试在运行 diff 算法之前添加额外的 html 标记。例如,我将通过“预处理器”运行文本,它将“SOP 1, 2”转换为 SOP 1, 2
一旦 Diff 过程返回完整的更改文本,我会扫描它并注意当前的“类”文本,当有 <del> 或 <ins> 时,我会捕获标签之间的文本并使用 SELECT CASE阻止类以解决每个更改。
这实际上在大多数情况下都可以,但是我必须解决许多问题,例如添加 Diff 决定最短路径是删除某些开始标签并插入其他标签。这将创建一个场景,即有两个 <span> 标签但只有一个 </span> 标签。
终极问题
我正在寻求建议,要么继续我已经开始的方向,要么尝试不同的方法,然后再投入更多时间来寻找次优的解决方案。
提前谢谢大家。
另请注意:
典型的运行时间大约是 1.5 到 2.5 秒,我会尝试更多花哨的东西和一堆 debug.prints。所以跑一两次额外的传球不会是杀手。
【问题讨论】:
标签: html vba algorithm ms-access diff