NonSoft

VBSやVBAでファイル比較し差分を出力する方法


 ち〜な〜み〜に〜

VBS(VB SCRIPT/WSH)やVBAで手軽にファイルを比較しテキスト差分を出力する方法をご紹介します。

ご紹介する方法はテキスト差分解析DLL(VB6/VB.NET/C#.NET)を使用する方法です。

このDLLを使うとあっと言う間にファイルの差分がCSV出力出来ます。
このファイル差分結果を使った応用はお任せします。

このDLLは元々VB6対応なのでVBSでも使用出来ると思っていましたが、
ファイル差分解析結果がStringの配列だとVBSからは使用出来ないようで、、、
Ver1.0.0.3からVariantでファイル差分解析結果を返すクラスを追加しました。

とりあえず、VBSのファイル差分出力サンプルソースを見てください。

(注意)
64bit(x64)版のWINDOWSで標準のVB SCRIPTを実行するとCreateObjectでエラーが発生するため、
32bit(x86)版のVB SCRIPT(C:\Windows\SysWow64\cscript.exe)を実行してください。

フォルダ差分関係のその他のサンプルソースはこちらです。
VBSやVBAでフォルダ比較し差分を出力する方法
VBSやVBAでフォルダの変更を監視する方法
VBSやVBAでファイルの変更を監視する方法

コマンドライン(バッチ)でファイル比較(フォルダ比較)する方法はこちらです。
コマンドライン(バッチ)でファイル比較する方法

ファイル差分関係のその他のサンプルソースはこちらです。
2つのテキストファイルの差分を解析するサンプル(VB6)
2つのテキストファイルの差分を解析するサンプル(VB.NET)

フォルダ差分(ファイル差分)関係のその他のツールやサンプルソースはこちらです。
ファイル比較/フォルダ比較(ツール&サンプル)
ファイル監視/フォルダ監視(ツール&サンプル)


★ファイル差分出力サンプルソース
' ------------------------------------------------
' 事前にNonDiffVb6.dllをレジストリ登録してください
' レジストリ登録方法:regsvr32 NonDiffVb6.dll
' ------------------------------------------------
' テキスト差分オブジェクト定義
Private objDiff

' テキスト差分解析AP呼び出し
DiffTest

MsgBox "終了"

' テキスト差分解析AP
Private Sub DiffTest()
    ' NonDiffVb6.dllのオブジェクト生成
    Set objDiff = CreateObject("NonDiffVb6.NonDiffClassV")

    ' テキストファイル入力
    strDt1 = TextRead("TestUtf8.txt")
    strDt0 = TextRead("TestSJIS.txt")

    ' テキスト差分解析
    blnNoSp = False ' 空白文字を比較しない時True
    dfList = objDiff.NonDiff(strDt0, strDt1, blnNoSp, 1, 0, 1, "file0", "file1")

    ' 差分解析結果出力
    DiffWrite "DiffOut.csv", dfList
End Sub

' テキストファイル入力
Private Function TextRead(ByVal fpath)
    ' テキストをバイト配列で読込
    Set objADOS = CreateObject("ADODB.Stream")
    objADOS.Type = 1
    objADOS.Open
    objADOS.LoadFromFile fpath
    objADOS.Position = 0
    bytCode = objADOS.Read()
    objADOS.Close

    ' 文字コード判定(blnBin=バイナリ判定有り)
    blnBin = True
    Dim codeName
    codeName = objDiff.GetCodeName(bytCode, blnBin)

    ' 文字コード変換
    Select Case codeName
    Case "SJIS"
        TextRead = objDiff.SJIS_To_VbUnicode(bytCode)
    Case "JIS"
        TextRead = objDiff.JIS_To_VbUnicode(bytCode)
    Case "EUC"
        TextRead = objDiff.EUC_To_VbUnicode(bytCode)
    Case "UNICODE"
        TextRead = objDiff.UNICODE_To_VbUnicode(bytCode)
    Case "UTF7"
        TextRead = objDiff.UTF7_To_VbUnicode(bytCode)
    Case "UTF8"
        TextRead = objDiff.UTF8_To_VbUnicode(bytCode)
    Case "BIN"
        TextRead = objDiff.SJIS_To_VbUnicode(bytCode)
    Case Else
        TextRead = objDiff.SJIS_To_VbUnicode(bytCode)
    End Select
End Function

' 差分解析結果出力
Private Sub DiffWrite(ByVal fpath, ByVal dfList)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txf = fso.CreateTextFile(fpath, True)
    For i = 1 To UBound(dfList, 2)
        txf.WriteLine dfList(0, i) & "," & _
            dfList(1, i) & "," & dfList(2, i) & "," & _
            dfList(3, i) & "," & dfList(4, i)
    Next
    txf.Close
End Sub