作者在 2025-08-14 11:49:51 发布以下内容
比对结果说明:(见插图-插图中有VB代码)
1 左边带行号的行:是新文本的行,行号与新文本一致。(立足“新文本”)
其中,行号右边不带“!>”的行,是原有的行【1】;带“!>”的行,是新增加的行【2】。
2 左边无行号的行:是修改后已经删除的行,行右端的数字是它在旧文本中的行号【3】。
思路分析:(参见代码)(旧文本的每1行,放入数组 A(pn1);新文本的每1行,放入数组 B(pn2)。 )
文本比对后,根据实际文本的内容,2个文本的第1行的关系,只存在两种可能。
第一种是,两个文本的第1行是相同的(If Then)。这比较好办:给它加上‘行号’,然后两个行号(pn1和pn2)都加1【1】。
第二种是,两个文本的第1行不相同 (Else)。那么,两个文本的第1行就是第1次差异的起始行,即:
QS(0,1)=1 而且 QS(1,1)=1
如果是‘第二种’,则要分清是‘删除’还是‘插入’。(‘更改’其实是‘插入’和‘删除’的共同效果)
这是根据 CD (连续的差异行数)是否 大于零 来判断的:若旧文本 CD(0,mn)>0 则是‘删除’;若新文本 CD(1,mn)>0 则是‘插入’。
是‘插入’好办:加上行号和“!>”就可以了【2】。
★如果是‘删除’【3】,那就麻烦了:
要把旧文本的这1行的内容 【A(pn1 + i)】 接上 【Ls】 ("*") ,接上旧文本的行号【pn1 + i】之后★★、再送入到★新文本的‘上一行’内容【B(pn2 - 1)】后面去。 也就是,★★新文本的这一行的内容(数组变量B()的元素),实际包含了★★旧文本中后来编辑时连续删除的行。
B(pn2 - 1) = B(pn2 - 1) & Lt & A(pn1 + i) & Ls & pn1 + i & vbCrLf
★★注意那些:pn1 = pn1 + i 和 pn2 = pn2 + j ! 等到完成 Else、遇到 (Loop)时,又会遇到“两个文本中内容相同(公共子串)”的行(两边的行号不一定相同)。这样,通过 Do Loop 把整个数组 B() 更新填充完成。送到窗口输出。
这样,比对结果文本实际包含了新、旧 2个文本的全部的行!
怎样取得文本比对的“差异数据”(QS、CD),请参阅我 2025-03-01 14:07 在本站(BCCN)的博文“文本比对程序设计--按“求同存异”来梳理文本;用“反转的文本”为“状态数组”充值”。
1 左边带行号的行:是新文本的行,行号与新文本一致。(立足“新文本”)
其中,行号右边不带“!>”的行,是原有的行【1】;带“!>”的行,是新增加的行【2】。
2 左边无行号的行:是修改后已经删除的行,行右端的数字是它在旧文本中的行号【3】。
文本比对后,根据实际文本的内容,2个文本的第1行的关系,只存在两种可能。
第一种是,两个文本的第1行是相同的(If Then)。这比较好办:给它加上‘行号’,然后两个行号(pn1和pn2)都加1【1】。
第二种是,两个文本的第1行不相同 (Else)。那么,两个文本的第1行就是第1次差异的起始行,即:
QS(0,1)=1 而且 QS(1,1)=1
如果是‘第二种’,则要分清是‘删除’还是‘插入’。(‘更改’其实是‘插入’和‘删除’的共同效果)
这是根据 CD (连续的差异行数)是否 大于零 来判断的:若旧文本 CD(0,mn)>0 则是‘删除’;若新文本 CD(1,mn)>0 则是‘插入’。
是‘插入’好办:加上行号和“!>”就可以了【2】。
★如果是‘删除’【3】,那就麻烦了:
要把旧文本的这1行的内容 【A(pn1 + i)】 接上 【Ls】 ("*") ,接上旧文本的行号【pn1 + i】之后★★、再送入到★新文本的‘上一行’内容【B(pn2 - 1)】后面去。 也就是,★★新文本的这一行的内容(数组变量B()的元素),实际包含了★★旧文本中后来编辑时连续删除的行。
B(pn2 - 1) = B(pn2 - 1) & Lt & A(pn1 + i) & Ls & pn1 + i & vbCrLf
★★注意那些:pn1 = pn1 + i 和 pn2 = pn2 + j ! 等到完成 Else、遇到 (Loop)时,又会遇到“两个文本中内容相同(公共子串)”的行(两边的行号不一定相同)。这样,通过 Do Loop 把整个数组 B() 更新填充完成。送到窗口输出。
这样,比对结果文本实际包含了新、旧 2个文本的全部的行!
怎样取得文本比对的“差异数据”(QS、CD),请参阅我 2025-03-01 14:07 在本站(BCCN)的博文“文本比对程序设计--按“求同存异”来梳理文本;用“反转的文本”为“状态数组”充值”。