文本比较器的具体实现方法
本帖最后由 jonny007x 于 2009-12-05 15:22:05 编辑 小弟近来在写一个文本比较器,但是碰到了,处理速度,内存占用,处理详细度这三者之间的冲突问题
所以上来求教各位高手给一个好点的方案
下面是我的方案
1读两个文本,并分别按行赋值给字符串数组tx1 和tx2
2然后对tx1 和tx2的各个数组元素逐个比较,用1记录相同,用0记录不同,并建立二元数组,以保存结果
3处理二元数组,计算出最短路径
4按最短路径输出文本,按照向同行在左右文本框里对齐的方法(用回车调整对齐)
5给不同的行着色
虽然我的方案已经实现,但是有几个缺点
首先就是内存占用问题,因为我把文本都读到数组里去了,两个几十K的代码文本比较要占用60多M内存。但是如果从文本框里处理,就要计算行号,获取行什么的,效率反而更低,而且考虑到之后还要输出,调整行对齐什么的,计算更烦,效率也更低
然后是处理速度的问题,本来我打算连相似行也计算出来的,但是计算相似行必定要计算字符相同问题,这么一来,对于动辄上万字符的代码,处理起来根本不行,10分钟都计算不出结果,所以我现在用的方法是比较字符串数组里相应数组是否相同,也就是说哪怕差一个空格或者一个tab就不同了
最后的问题是也就是上面速度问题中的差一个tab或者一个空格就会被判为不同,想要处理详细就要牺牲速度,但是速度太慢的话exe程序就会直接无响应
希望高手能指点我一下,因为我看到别人也用vb写出了文本比较器,而且运行还是较不错的,无论速度还是相似度,相似度,至少他可以判断文本头或尾差一个tab或者空格这两个文本还是相同的
另外,我用的是VB6
[解决办法]
参考:
http://topic.csdn.net/u/20080216/15/7a4e4f63-6c0f-4025-b2bc-a95c5c9d396e.html
也许不一定需要载入内存?
[解决办法]
我做过二进制文件的比较器。
实际上,文本文件也可以用二进制方式读取比较。优点是,系统不会尝试将文件在打开时就读入虚拟内存。当文件很大时,这样的操作会使系统长时间挂起。
我在做另外一个文本数据转换程序时,是将文件用二进制方式打开,每次读取几K来处理。可以用 StrConV 函数将读入的数据转成字符串,再用 Split 函数按行分割。最后不足一行的残余,保存到下一次读取时拼在前面。
这样做的好处,就是快。