程序设计:利用Excel的“条件格式”(填充),美化和保存“比对结果”(*.xlsx)
●不知什么原因,我原文的插图都无法显示,只能把插图放到第2楼补上。“多行形式”的文本比对与“文章形式”的文本比对虽然在算法上基本相同,但是“多行形式”的比对结果的表示却有特别的要求:1 两边的“对应相同行”要全部“左右对齐”(这需要插入斜纹行来调节);2 两边的“特殊行”要有醒目的底纹(颜色填充);3 左右两部分要“同步滚动”。
我的解决方法是:1 利用“比对过程中获得的2个二维数组 QS()、CD()”插入斜纹行来调节。2 和 3 需要先利用QS()、CD(),在两边的“特殊行”的行首标上“!”,然后把比对结果送到 Excel ,用“条件格式”加上醒目的底纹(颜色填充)来完成。这样的文件,脱离比对程序也可以打开浏览。
什么是“特殊行”?我在下文中会有说明。
我们可以从如下的视角来理解要比对的“文本A”与“文本B”之间的关系:
先把“文本A”复制一份,名为“A副本”,然后把“A副本”进行编辑,最后把编辑完的“A副本”改名为“文本B”。
当比对程序在比对过程中发现对“A副本”做过“删除行”和“修改行”的操作时,比对程序会在“文本A”的对应行的行首标注记号“! ”(似乎是为了“有案可查”);当比对程序发现对“A副本”做过“插入行”的操作时,比对程序会在那些插入的行和修改后的行的行首也标注记号“! ”。
这样一来,Excel 的“条件格式”功能就能通过“填充颜色”来醒目地显示两个文本中的“特殊的行”了。“文本A”中那些为了“备案‘被删除、被修改’而打上记号的行”和“文本B”中“外来的行”就是“特殊行”。
我的“文本比对程序”的设计思路是:对“文本B”中的每一行,从上到下进行鉴别:这一行【是不是“A副本”中原本已有的行(不该加标记的行)】。鉴别的依据是:是否符合(两边的对应行)是不是“一 一对应”、上下顺序一致(这2点容易做到)、“A副本”中保留最多的不动的行。(3个原则)
鉴别过程中,必须注意要收集“副产品”。什么副产品呢?就是:每一次编辑(删除行、插入行、修改行)的“起始行号”QS()和编辑的“行数”CD()。【其实是重要的、关键的数据】。观察看图“Book1”的前 15、16行:
正是由 QS()和CD() 记录了两个文本中的“特殊的行”。我们才得以在两个文本中插入“斜纹行”和标注记号“!”
2点说明:
1.注意“最长公共子序列”的算法规则:
“文本A”中“没有标注记号的行”与“文本B”中“没有标注记号的行”形成“一 一对应、顺序一致”的关系。也就是说,那些行组成了“文本A”与“文本B”的“公共子序列”。
我们知道,“文本比对算法”有一个“潜——默认的规则”:让“A副本”保留最多的、不编辑(不改动)的行。这似乎有点不好理解。我举个例子:
例:“文本A”有5行,每行2个字,按由上到下分别是“男1、男2、男3、男4、女1”。
“文本B”也有5行,每行2个字,按由上到下分别是“女1、男1、男2、男3、男4”。
对于文本由A到B的变化,我们一般会说:“后来,女1排到4位男士的前面去了”(保留最多不动的行),而不说“后来,4位男士排到女1的后面去了”。
所以程序是在两边“女1”的那一行的行首加上“!”符号。(只有1行、而不是4行加符号)。虽然实际情况是一样的,但是,如果不约定好统一的表达方式,那么比对结果的表示就会让人看不懂。
2.【利用QS()和CD()】加 “!”标记、加“斜纹行”。给每一行加行号。
当两边的CD()值不相等时,(为了对齐)就要在“少”的那一边插入若干“斜纹行”。
当CD()值大于零时,就要在行首加上“!”,以让 Excel 的“条件格式”识别、填充颜色。
rar压缩文件中有全部的VB代码(.txt)。
这是自编的程序,如果读者发现有错误和不妥,请给我指出。如有疑问,也请提出,我会尽力解答。谢谢!
[此贴子已经被作者于2024-11-28 10:48编辑过]