- ベストアンサー
VBSで2つのテキストファイルの文字列比較と出力方法
- VBSで2つのテキストファイルの文字列を比較し、同じものがない場合に別ファイルに出力する方法を教えてください。
- 配列と文字列のフィルターを使用してもうまくいかず、エラーが発生してしまいます。
- 一次元の配列のはずなのに、どうしてうまくいかないのでしょうか?
- みんなの回答 (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
その他の回答 (5)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
試しに作ってみました。 あまり大きくないファイルだったらこれでいいと思います ------------------------------------------------------------- '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)
#3 flagを0以外にしている部分がないと思ってたら訂正された… (実際に動かしてもいないのに自信ありだなんて自信家ですね) これって、Text2にあって、Text1には無いモノがあるってことを考慮してないですよね。
補足
お返事が遅くなってすいません。 ありがとうございます。 Text2にあって、Text1にはないというものは原則発生しません。発生すると困ってしまいますので・・・ 現在回答いただいたプログラムを拝見させていただいております。ありがとうございます。
- mac_res
- ベストアンサー率36% (568/1571)
すみません、一行間違えました。出しなおします。 -- 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)
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)
結果ファイルの内容は Line4 Line1 の様に順番は変わってしまってもいいんでしょうか 変わってもいいなら、 作業ファイルとしてText1とText2をソートしたものを用意して 先頭から順に比べて書き出していくというような方法でできます。 小さいファイルなら、Dictionaryオブジェクトを使ってできると思います。
お礼
また返事が遅くなってしまいすいません。 上記プログラムで完璧に動いてくれました! もちろん一つ前のものでも動きました。 本当に助かりました。 どうもありがとうございます。