- ベストアンサー
VBScriptでDIFF作成 - VBScriptを使用してファイルの差分を取得する方法
- VBScriptを使用してファイルの差分を取得する方法について説明します。
- VBScriptのコードでUNIXのdiffのようなものを作成することができます。
- ファイル1とファイル2を比較し、異なる行を表示するVBScriptの関数を作成します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんなのどうでしょうか? Set fso = CreateObject("Scripting.FileSystemObject") Const ForReading = 1, ForWriting = 2, ForAppending = 3 Set f1 = fso.OpenTextFile("d:\targetA.txt", ForReading) Set f2 = fso.OpenTextFile("d:\targetB.txt", ForReading) FA1=f1.ReadAll FA2=f2.ReadAll f1.Close f2.Close Dim SP1,SP2 SP1=Split(FA1,vbCrLf) SP2=Split(FA2,vbCrLf) PNT_C1=0 PNT_C2=0 PNT_M1=0 PNT_M2=0 PNT_MX1=Ubound(SP1)-1 PNT_MX2=Ubound(SP2)-1 SPE1=0 SPE2=0 DIFF_STR="" R_DIFF_STR="" Do Until (SPE1=1 and SPE2=1) if PNT_C1<=PNT_MX1 then ST1=SP1(PNT_C1) end if if PNT_C2<=PNT_MX2 then ST2=SP2(PNT_C2) end if if PNT_C1>PNT_MX1 and PNT_C2<=PNT_MX2 then for i=PNT_C2 to PNT_MX2 DIFF_STR=DIFF_STR & "> " & SP2(i) & vbCrLf next PNT_C2=PNT_MX2+1 end if if PNT_C1<=PNT_MX1 and PNT_C2>PNT_MX2 then for i=PNT_C1 to PNT_MX1 DIFF_STR=DIFF_STR & "< " & SP1(i) & vbCrLf next PNT_C1=PNT_MX1+1 end if if PNT_C1<=PNT_MX1 and PNT_C2<=PNT_MX2 then if StrComp(ST1,ST2)<>0 then if PNT_C2+1<=PNT_MX2 then JMP2=-1 for i=PNT_C2+1 to PNT_MX2 if StrComp(ST1,SP2(i))=0 then JMP2=i exit for end if next if JMP2>0 then PNT_C1=PNT_C1+1 for i=PNT_C2 to JMP2-1 DIFF_STR=DIFF_STR & "> " & SP2(i) & vbCrLf next PNT_C2=JMP2+1 else if PNT_C1+1<=PNT_MX1 then DIFF_STR=DIFF_STR & "< " & ST1 & vbCrLf PNT_C1=PNT_C1+1 end if DIFF_STR=DIFF_STR & "> " & ST2 & vbCrLf PNT_C2=PNT_C2+1 end if end if if StrComp(DIFF_STR,R_DIFF_STR)=0 then if PNT_C1+1<=PNT_MX1 then JMP1=-1 for i=PNT_C1+1 to PNT_MX1 if StrComp(ST2,SP1(i))=0 then JMP1=i exit for end if next if JMP1>0 then PNT_C2=PNT_C2+1 for i=PNT_C1 to JMP1-1 DIFF_STR=DIFF_STR & "< " & SP1(i) & vbCrLf next PNT_C1=JMP1+1 else DIFF_STR=DIFF_STR & "< " & ST1 & vbCrLf PNT_C1=PNT_C1+1 if PNT_C2+1<=PNT_MX2 then DIFF_STR=DIFF_STR & "> " & ST2 & vbCrLf PNT_C2=PNT_C2+1 end if DIFF_STR=DIFF_STR & "> " & ST2 & vbCrLf PNT_C2=PNT_C2+1 end if end if end if else PNT_C1=PNT_C1+1 PNT_C2=PNT_C2+1 end if end if if PNT_C1>PNT_MX1 then SPE1=1 end if if PNT_C2>PNT_MX2 then SPE2=1 end if R_DIFF_STR=DIFF_STR Loop Wscript.echo DIFF_STR
その他の回答 (2)
- dscripty
- ベストアンサー率51% (166/325)
Gnu の diffutils の diff.c を単純に VBScript に移植すればいいんじゃないかな? http://core.ring.gr.jp/pub/GNU/diffutils/ 仕事ならなおさら。 結構ソース長いけど、ほとんどがオプションの処理だから、ロジック自体は難しくないと思うよ。 あと、 「挑戦できる方お願いします。」 挑戦して欲しいなら、投稿するサイトが別だよ? http://ja.doukaku.org/
- imogasi
- ベストアンサー率27% (4737/17069)
出現順番をくづしても良いなら、ファイルのマッチングのアルゴリズムで出来るのではないか。 両ファイルをそれぞれソートしておく必要があるが。ソートが出来るテキストエディ他が必要になったりする。 VBScriptの指定があるが、エクセルは使えないのか? こちらなら読み込んでソートなども出来る。 またFindメソッドで同じものがあるかどうか探しも出来る。 ーー >挑戦できる方お願いします。 回答者は学校の生徒じゃない。 また世の中広いし、この問題はそう難しいとは思わないタイプだ。 丸投げしておいて、この書き方は失礼だと思う。
お礼
回答ありがとうございます >出現順番をくづしても良いなら、ファイルのマッチングのアルゴリズムで出来るのではないか。 順番は崩すことはできません。 もらったASP(aps.netでなくて)の改造を手っ取り早くする必要があって質問しました。 >回答者は学校の生徒じゃない。 >また世の中広いし、この問題はそう難しいとは思わないタイプだ。 >丸投げしておいて、この書き方は失礼だと思う。 あまり深く考えずに質問をしてすみません
お礼
おくれましたが、回答ありがとうございます >http://core.ring.gr.jp/pub/GNU/diffutils/ 参考になりました。と同時にかなり自分にとっては複雑なプログラム であることがわかりました。 とりあえず、ベストアンサーにした人のものを参考にして 造ることにしました。