利用“差异数据”(QS、CD),立足“新文本”来展示比对结果(按行比对)

作者在 2025-08-14 11:49:51 发布以下内容
比对结果说明:(见插图-插图中有VB代码)
1 左边带行号的行:是新文本的行,行号与新文本一致。(立足“新文本”)
    其中,行号右边不带“!>”的行,是原有的行【1】;带“!>”的行,是新增加的行【2】。
2 左边无行号的行:是修改后已经删除的行,行右端的数字是它在旧文本中的行号【3】。
图一.png (上传于2025-08-14 11:49:51)
图一.png

思路分析:(参见代码)(旧文本的每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)的博文“文本比对程序设计--按“求同存异”来梳理文本;用“反转的文本”为“状态数组”充值”。


默认分类 | 阅读 7 次
文章评论,共0条
游客请输入验证码
浏览106418次
文章分类