ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3991018 ファイルを比較して差分のみを出力するには…?
質問者:taoi1981 とつぜんですみません。緊急なので投稿しました。
VBSを使って、2つのファイル(ファイルAとファイルB)の1行目からファイルの終わりまでを比較して差分を出力するプログラムを作成したいと考えています。
ファイルの1列目は主キーとなっております。

<ファイルA>
100,A
110,B
133,D
155,R

<ファイルB>
100,A
110,B
133,F
155,P


また差分の出力は上の例でいくと、
133,D → F
155,R → P
というようなかたちでファイルに出力したいです。
どなたかアドバイス頂けないでしょうか?
よろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/01 22:51

回答

ANo.1 ADOのデータベースとして扱うと簡単です。

Dim Aファイル, Bファイル
Dim CON, RST, TXT
Dim FSO, STM
Dim F1, F2, F3, F4
'== ファイル名を定義(xx〜は実際のパス名にすること)
Aファイル = "C:\xx〜\A.txt" 'Aファイルのパス名
Bファイル = "C:\xx〜\B.txt" 'Bファイルのパス名
'== 接続オブジェクトを生成する
Set CON = CreateObject("ADODB.Connection")
'== 接続文字列を生成する
TXT = "Provider=Microsoft.Jet.OLEDB.4.0;"
TXT = TXT & "Data Source=C:\xx〜\;"
TXT = TXT & "Extended Properties=""TEXT;FMT=DELIMITED;HDR=NO;"""
'== 接続(パスやキーワードを間違うとエラーになる)
CON.Open TXT
'== SQLを生成する(両ファイルに存在し、第2フィールドが異なる)
TXT = "SELCT A.F1,A.F2,B.F2,1 FROM " & Aファイル & " AS A"
TXT = TXT & " INNER JOIN " & Bファイル & " AS B ON "
TXT = TXT & " A.F1=B.F1 WHERE A.F2<>B.F2"
'== SQLを生成する(Aファイルにのみ存在する)
TXT = TXT & " UNION SELECT A.F1,A.F2,B.F1,2 FROM " & Aファイル & " AS A"
TXT = TXT & " LEFT JOIN " & Bファイル & " AS B ON "
TXT = TXT & " A.F1=B.F1 WHERE B.F1 Is Null"
'== SQLを生成する(Bファイルにのみ存在する)
TXT = TXT & " UNION SELECT B.F1,B.F2,A.F1,3 FROM " & Aファイル & " AS A"
TXT = TXT & " RIGHT JOIN " & Bファイル & " AS B ON "
TXT = TXT & " A.F1=B.F1 WHERE A.F1 Is Null"
'== レコードセットを作成する(SQLを間違うとエラーになる)
Set RST = CON.Execute(TXT)
'== 出力ファイルを開く
Set FSO = CreateObject("Scripting.FileSystemObject")
Set STM = FSO.CreateTextFile("C:\xx〜\結果.txt", True)
'== 出力ループ(レコードセットのEOFまで)
Do Until RST.EOF
  '== 核フィールドを取得
  F1 = RST.Fields(0).Value
  F2 = RST.Fields(1).Value
  F3 = RST.Fields(2).Value
  F4 = RST.Fields(3).Value
  Select Case F4 '分類による処理
    Case 1: STM.WriteLine F1 & "," & F2 & "→" & F3
    Case 2: STM.WriteLine F1 & "," & F2 & "→(Bなし)"
    Case 3: STM.WriteLine "(Aなし)→" & F1 & "," & F2
  End Select
  '== 次のレコードへ移動する
  RST.MoveNext
Loop
'== 各オブジェクトを閉じる
STM.Close
RST.Close
CON.Close
回答者:nda23
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/02 11:13
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)