Ziya 发表于 2010-7-29 11:50:18

关于文本文件比较,如何跳过空行呢?

本帖最后由 Ziya 于 2010-7-29 11:57 编辑

想写一个对比文本文件的程序
自己动手完成了第一个版本

示例文本1
1
2
3
4
5
示例文本2
1
4
3
2
6#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#Include <File.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 438, 192, 124)
$ListView1 = GUICtrlCreateListView("", 16, 48, 233, 369)
_GUICtrlListView_InsertColumn($ListView1, 0, "文件名", 100)
_GUICtrlListView_InsertColumn($ListView1, 1, "行号", 100)
_GUICtrlListView_InsertColumn($ListView1, 2, "内容", 100)
$ListView2 = GUICtrlCreateListView("", 328, 48, 265, 369)
_GUICtrlListView_InsertColumn($ListView2, 0, "文件名", 100)
_GUICtrlListView_InsertColumn($ListView2, 1, "行号", 100)
_GUICtrlListView_InsertColumn($ListView2, 2, "内容", 100)

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$path1="file1.txt"
$path2="file2.txt"
$file1 = FileOpen($path1)
$file2 = FileOpen($path2)

$i1 = _FileCountLines($path1)
FileDelete("bt.txt");删除临时文件
For $i = 1To $i1
    $line1 = FileReadLine($file1,$i)
        $line2 = FileReadLine($file2,$i)
    $b = StringCompare ($line1,$line2)
        FileWrite("bt.txt",$b&@CRLF);将比较结果写入临时文件bt.txt       
Next

$file3 = FileOpen("bt.txt")
$ii = _FileCountLines("bt.txt")
        $g1 = 0
       
For $i =1 To $ii
        $d = FileReadLine($file3,$i);根据临时文件回显不同的行

                If $d <> 0 Then
                        $t1 = FileReadLine($file1,$i)
                        $t2 = FileReadLine($file2,$i)
                       
                        _GUICtrlListView_AddItem($ListView1,$path1,$g1)
                        _GUICtrlListView_AddSubItem($ListView1,$g1,$i,1)
                        _GUICtrlListView_AddSubItem($ListView1,$g1,$t1,2)
                        _GUICtrlListView_AddItem($ListView2,$path2,$g1)
                        _GUICtrlListView_AddSubItem($ListView2,$g1,$i,1)
                        _GUICtrlListView_AddSubItem($ListView2,$g1,$t2,2)
                       
                        $g1 = $g1 + 1
EndIf
                Next
FileClose($file1)
FileClose($file2)
FileClose($file3)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd思路是这样的
1.逐行读取文件1和文件2
2.比较字符串的差异,写入临时文件(bt.txt)中进行记录,行数和原始的文件1/2一一对应
3.读取临时文件,如果相同则跳过,如果不同($d <> 0)则回显原始文件1和2的对应行号
4.将回显内容写入listview1与listview2,按照"文件名|行号|内容"显示出来

运行结果为


现在问题来了
如果文本中包含空行
示例文本1
1
2
3
4

5
示例文本2
1

4
3
2

6
请问如何能够实现
1.跳过空行进行比较
2.在listview1和listview2中显示出不同行的行号和内容
希望的结果为


关于第1点,可以在比较前先把空行替换掉...但是这样就无法实现第2点要求了...
所以做到这里就卡着了....

3mile 发表于 2010-7-29 16:31:31

二进制比较。
页: [1]
查看完整版本: 关于文本文件比较,如何跳过空行呢?