• 締切済み

ファイルを比較して差分のみを出力するには…?

とつぜんですみません。緊急なので投稿しました。 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 というようなかたちでファイルに出力したいです。 どなたかアドバイス頂けないでしょうか? よろしくお願いします。

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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

関連するQ&A

  • awkで二つのファイルを比較し出力する方法

    UNIXで二つのファイルを使って別ファイルを出力する 処理をしたいのですが、awkで二つのファイルを扱う方法 が分かりませんでした。 やりたい処理は以下のような事です。 ファイルAの1行目"AAA B"と同じ行がファイルBにあったら、ファイルAの"AAA B"の次の行に、 ファイルBの次の行"YYY bbb"を挟み込みます。 もし、ファイルBに同じ行がなかったら、 ファイルAの次の行に"NG"を挟み込みます。 [ファイルA] AAA B ZZZ B AAA C ZZZ C AAA D ZZZ D [ファイルB] AAA B YYY bbb AAA C YYY bbb [出力ファイル] AAA B YYY bbb ZZZ B AAA C YYY ccc ZZZ C AAA D NG どなたか良いスクリプトありましたら 教えていただけないでしょうか。 よろしくお願いします。

  • 1行単位で差分を出力するテキスト比較ソフト

    1行単位で差分を出力するテキスト比較ソフトを探してます。 2つのファイルで差異を比較するDIFFソフトは多いですが、 比較対象行の上下の順番が違うとうまく差分を検出してくれません。 処理速度は遅くなると思いますが、2つのファイル間で1行ごとに 差分を表示し、保存できるソフトがあれば紹介してください。 よろしくお願いします。

  • $git diff 差分を表示で何かがへんなんです

    お世話になります。 Gitを勉強していてわからないことがあります。 対象となるファイルの中を書き換えました。 その後、変更されている差分を表示したところよくわからないコードが出てきました。 下記のコードが意味するよくわかりません。私に何を教えてくれているのでしょうか? -1<8D>s<96>ڂ<F0><92>lj<C1><82><B5><82>܂<B5><82><BD><81>B -2<8D>s<96>ڂ<F0><92>lj<C1><82><B5><82>܂<B5><82><BD><81>B 以上、よろしくお願いします。 出力結果 user@user-PC /c/first_git (master) $ git diff diff --git a/README.md b/README.md index 4dfe31a..5f11ae3 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ -1<8D>s<96>ڂ<F0><92>lj<C1><82><B5><82>܂<B5><82><BD><81>B -2<8D>s<96>ڂ<F0><92>lj<C1><82><B5><82>܂<B5><82><BD><81>B \ No newline at end of file +1行追加 +2行追加 +3行追加 \ No newline at end of file

  • Excel差分比較抽出の関数について

    AとB列で【4桁までの値】が一致する値の差分をC、D列に抽出したいです。 お手数ですが教えてください。 例、 A列   B列  C列(Aの差分を表示) D列(Bの差分を表示) ab12   ab12(1-1) ef11(A列の差分) aaaa(B列の差分) ab12 ab12(1-2) gh22(A列の差分)  bbbb(B列の差分) cd24 cd24 ef11 aaaa gh22 bbbb

  • 2ファイルの比較

    2ファイルの比較 中身が以下のようなファイルがあります。 ---ファイルA中身--- a c c d e f f ----------------- ---ファイルB中身--- a a b b b c d e g ----------------- この2ファイルから、以下のようなファイルを作りたいです。 ---ファイルC中身--- b b g ----------------- つまり、ファイルBにはあって、ファイルAにはない行をファイルCに入れたいです。 while($line_B = <FILEB>){ while($line_A = <FILEA>){ @A = split(/,/,$line_A); if($line_B !~ /$line_A/){ print FILEC $line_B; } } seek(FILEA,0,0); } としてみたのですが、全然ダメです。理由も分かってます。 が、お手上げです。ご教授お願いします。

  • 差分のLZHファイルの作り方

    win2000のDOSコマンドから実行する方法を模索しています。 指定するディレクトリの中身全部を圧縮するとき、別の場所に作ってある「A.LZH」と比較して差分ファイルだけを「B.LZH」の名前で圧縮するという方法はありませんか? つまり、これから圧縮しようとするファイルに対し「A.LZH」の中に無い物だけを「B.LZH」として圧縮したいのです。 差分のバイナリファイルを作るフリーウェアが存在するようなのですが、どうしても差分のLZHを作りたいので。 通常はLHMeltを使っています。

  • ファイル出力ついて

    当方、JAVA初心者です。 CSVファイルの出力を行うプログラムを作成しています。 仕様として1行目はヘッダ部分を出力し、 2行目以降にDBの値を出力するCSVファイルを作成しようとしています。 例 (ヘッダ部分)"項目A----","項目B----","項目C----","項目D----" (データ部分)"項目Aの値","項目Bの値","項目Cの値","項目Dの値"             ・             ・ ですが、データ部分の個数が不変になっており、ヘッダ部分がずれてしまいます。 例 項目Cの数が2個ある場合はデータ部分に項目Cの値を2個出力する為、 項目Dのヘッダ部の列の下に項目Cの2個目の値が書き込まれてしまいます。 "項目A----","項目B----","項目C-----","項目D-----" "項目Aの値","項目Bの値","項目Cの値1","項目Cの値2","項目Dの値"             ・             ・ そこで、先にデータ部分の書き込みを行い、それぞれの項目のデータ件数の最大値を保持し、最後にデータ件数の最大値に合わせてヘッダ部分の書き込みを行おうと考えているのですが、 ファイルをopenしなおす方法以外で、 先に2行目以降の書き込みを行い、最後に1行目の書き込みを行う方法がわからなく困っております。 ご回答のほど、宜しくお願いします。

    • ベストアンサー
    • Java
  • アクセス 差分クエリ 合計値で比較

    クエリ1 Aさん 100円 Bさん 300円 Cさん 200円 Cさん 400円 クエリ2 Aさん 100円 Bさん 300円 Cさん 600円 Cさんのみクエリデータが2行に分かれています。 クエリ1とクエリ2の差分が出ないようにするにするにはどうすればよいかを教えていただけますでしょうか。 現状は、Cさんのみ差分で出てしまいます。 宜しくお願い致します。

  • エクセルの関数(列の差分を抽出)について

    A列(A1~A5)のデータと、B列(B1~B5)に1箇所でも差分があった場合に C7に"差分あり"みたいなことを表示させたいのですが、どのような関数になりますでしょうか。 countifの関数で試したのですが、うまくいかず。質問させて頂きます。       A列  B列   1行目  123 123 2行目  123 123 3行目  123 456 4行目  123 123 5行目  123 456 7行目 C7(列に差分があったかを表示させたい)

  • VBScriptでDIFF作成

    お世話になります 仕事で、VBScriptのコードでUNIXのdiffのようなものが必要なのですが。 といっても、100%同じでなくて構いません。作成できる方お願いします。 (なぜ、cygwinのdiff.exeを使わないの?という質問は無しでお願いします。) 例として、下記のような2つのテキストファイルから結果のようなものを出したいのです。 ファイル1  ファイル2      結果 A1      A1            < B1 B1      A2            > A2 C1      C1            > D2 D1      D2            < D2 D2      D1            > D3 E1      D3             < R1 R1      E1            > K1 R2      K1            < R2         R1 ファイル1とファイル2を交互に上からチェックする仕組みで考えています ファイル1の1行目のA1 と ファイル2の1行目のA1は同じだから表示しません ファイル1の2行目のB1 と同じものはファイル2の2行目以降にないので、< B1 と表示 ファイル2の2行目のA2 と同じものはファイル1の2行目以降にないので、> A2 と表示 ファイル1の3行目のA1 と ファイル2の3行目のC1は同じだから表示しません ファイル1の4行目のD1と同じものはファイル2の5行目なので、その間の行を表示 > D2 と表示 ファイル1は5行目のD2はファイル2の6行目以降にないので < D2 と表示 : Funcion VBS_Diff( Filename1 , Filename2 ) : VBS_Diff=(diffの結果文字列) End Function お手数ですが、挑戦できる方お願いします。