• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ギブアップ!!)

VBSで2つのテキストファイルの文字列比較と出力方法

このQ&Aのポイント
  • VBSで2つのテキストファイルの文字列を比較し、同じものがない場合に別ファイルに出力する方法を教えてください。
  • 配列と文字列のフィルターを使用してもうまくいかず、エラーが発生してしまいます。
  • 一次元の配列のはずなのに、どうしてうまくいかないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

少しでもメモリを節約するようにして変更してみました ------------------------------------------------------------ 'Text1.txtとText2.txtの共通しない部分を不一致.txtに書き出す。 Dim fso, TF1, TF2, TFo Dim Text, aLine Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set TFo = fso.CreateTextFile("不一致.txt") 'Text1をText2で消去 Set TF1 = fso.OpenTextFile("Text1.txt") Text = TF1.ReadAll TF1.Close Set TF2 = fso.OpenTextFile("Text2.txt") Do Until TF2.AtEndOfStream aLine = TF2.ReadLine & vbCRLF Text=Replace(Text, aLine, "") Loop TF2.Close '残りを書き出す TFo.Write(Text) 'Text2をText1で消去 Set TF2 = fso.OpenTextFile("Text2.txt") Text = TF2.ReadAll TF2.Close Set TF1 = fso.OpenTextFile("Text1.txt") Do Until TF1.AtEndOfStream aLine = TF1.ReadLine & vbCRLF Text=Replace(Text, aLine, "") Loop TF1.Close '残りを書き出す TFo.Write(Text) TFo.Close

take_dive
質問者

お礼

また返事が遅くなってしまいすいません。 上記プログラムで完璧に動いてくれました! もちろん一つ前のものでも動きました。 本当に助かりました。 どうもありがとうございます。

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

試しに作ってみました。 あまり大きくないファイルだったらこれでいいと思います ------------------------------------------------------------- 'Text1.txtとText2.txtの共通しない部分を不一致.txtに書き出す。 Dim fso, TF1, TF2, TFo Dim Text1, Text2, aLine Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set TF1 = fso.OpenTextFile("Text1.txt") Text1 = TF1.ReadAll TF1.Close Set TF2 = fso.OpenTextFile("Text2.txt") Do Until TF2.AtEndOfStream aLine = TF2.ReadLine & vbCRLF Text1=Replace(Text1, aLine, "") Loop TF2.Close Set TF2 = fso.OpenTextFile("Text2.txt") Text2 = TF2.ReadAll TF2.Close Set TF1 = fso.OpenTextFile("Text1.txt") Do Until TF1.AtEndOfStream aLine = TF1.ReadLine & vbCRLF Text2=Replace(Text2, aLine, "") Loop TF1.Close Set TFo = fso.CreateTextFile("不一致.txt") TFo.Write(Text1) TFo.Write(Text2) TFo.Close

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3 flagを0以外にしている部分がないと思ってたら訂正された… (実際に動かしてもいないのに自信ありだなんて自信家ですね) これって、Text2にあって、Text1には無いモノがあるってことを考慮してないですよね。

take_dive
質問者

補足

お返事が遅くなってすいません。 ありがとうございます。 Text2にあって、Text1にはないというものは原則発生しません。発生すると困ってしまいますので・・・ 現在回答いただいたプログラムを拝見させていただいております。ありがとうございます。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

すみません、一行間違えました。出しなおします。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- typedef struct _strlist { char *text; int flag; struct _strlist *next,*prev; } StrList; void CTmpDlg::OnOK() { CStdioFile fin1("test1.txt",CFile::modeRead),fin2("test2.txt",CFile::modeRead), fout("test3.txt",CFile::modeCreate|CFile::modeWrite); CString ss; StrList *head = NULL, *tail = NULL, *next, *list; while(fin1.ReadString(ss) != NULL) { list = new StrList; if ((next = head) != NULL) { next->prev = list; } else { tail = list; } list->next = head; list->prev = NULL; list->text = strdup(ss); list->flag = 1; head = list; } while(fin2.ReadString(ss) != NULL) { for (list = head; list != NULL; list = list->next) { if (strcmp(ss,list->text) == 0) { list->flag = 0; } } } for (list = tail;list != NULL; list = list->prev) { if (list->flag != 0) { ss = list->text; ss += "\r\n"; fout.WriteString(ss); } } for (list = head; list != NULL; list = next) { next = list->next; free(list->text); delete(list); } CDialog::OnOK(); }

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

typedef struct _strlist { char *text; int flag; struct _strlist *next,*prev; } StrList; void CStringDlg::OnOK() { CStdioFile fin1("test1.txt",CFile::modeRead),fin2("test2.txt",CFile::modeRead), fout("test3.txt",CFile::modeCreate|CFile::modeWrite); CString ss; StrList *head = NULL, *tail = NULL, *next, *list; while(fin1.ReadString(ss) != NULL) { list = new StrList; if ((next = head) != NULL) { next->prev = list; } else { tail = list; } list->next = head; list->prev = NULL; list->text = strdup(ss); list->flag = 0; head = list; } while(fin2.ReadString(ss) != NULL) { for (list = head; list != NULL; list = list->next) { if (strcmp(ss,list->text) == 0) { list->flag = 0; } } } for (list = tail;list != NULL; list = list->prev) { if (list->flag != 0) { ss = list->text; ss += "\r\n"; fout.WriteString(ss); } } for (list = head; list != NULL; list = next) { next = list->next; free(list->text); delete(list); } CDialog::OnOK(); }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

結果ファイルの内容は Line4 Line1 の様に順番は変わってしまってもいいんでしょうか 変わってもいいなら、 作業ファイルとしてText1とText2をソートしたものを用意して 先頭から順に比べて書き出していくというような方法でできます。 小さいファイルなら、Dictionaryオブジェクトを使ってできると思います。

関連するQ&A