- 締切済み
ファイルを比較して差分のみを出力するには…?
とつぜんですみません。緊急なので投稿しました。 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 というようなかたちでファイルに出力したいです。 どなたかアドバイス頂けないでしょうか? よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- nda23
- ベストアンサー率54% (777/1415)
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