• ベストアンサー
※ 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

  • VBAでテキストファイルの改行を無視する方法

    VBAでテキストファイルにある文字列を配列の変数に格納したいのですが、改行が含まれているとそこから2バイトずつずれてしまいます。 1行毎に読もうとしても1行の文字列が6000バイトぐらいあるので変数に格納しきれません。 読み込むテキストファイルは _________0_________1_________2・・・・________10 _______100________51 のようになっており、10バイトずつ変数に格納していきたいです(スペースも格納する必要あり) 以下のように作ったのですが、改行のあるところからずれてしまいます。 Sub ファイル読み込み() Dim buf(30000000) As String Dim i As Long i = 0 With CreateObject("Scripting.FileSystemObject") With .OpenTextFile("C:\test.text", 1) Do While .AtEndOfStream <> True buf(i) = .read(10) Loop End With End With End Sub 「次の文字列が改行コードである」ということが分かれば.skipで飛ばせるのですが、その判定式が探しても見つかりません。 どなたかご教授よろしくお願いします。

  • Rubyで配列をソートする

    15(tab)5634(改行) 24(tab)4446(改行) 24(tab)8357(改行) 24(tab)3287(改行) 56(tab)5465(改行) 56(tab)1324(改行) 56(tab)7544(改行) 上記のように1行にtabで区切られた2つの数値が並んでいるテキストファイルがあります。 このファイルを、Rubyを使って1列目が同じ数字の行ごとにソートしたいのですが、できなくて困っています。 上の例でしたら、1列目が24の3行を2列目の数値をキーとしてソート、1列目が56の3行を2列目の数値をキーとしてソートするということです。 一行ずつ読み込んで、array = line.split(/\t/)でタブでくぎって配列に格納するスクリプトを書いていたのですが、どうしてもできないので、力を貸していただけないでしょうか。 よろしくお願いします。

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • C言語について教えてください。

    二次元配列でまとめられた「配列で実現する文字列」の文字と文字列を表示する関数を定義し、その関数の機能を確認するプログラムを作成する。 ただし、以下の例のように文字列の個数が変更されても処理できる関数を作成する。 また、文字列の文字の個数は最大9とする(一次元配列の要素数は10とする) さらに、関数printf()をできるだけ用いない。 (1)二次元配列でまとめられたすべての文字列を「一度に」表示する関数を定義する (2)二次元配列でまとめられたすべての文字列の文字を「一度に」表示する関数を定義する。このとき、前回の課題で定義した「すべての文字を表示する関数print_all_char()」を新しく定義する関数から呼び出して用いる。 (3)二次元配列に各文字列を格納してまとめるとき、初期化ではなく、配列の宣言・定義の後で、関数strcpy()を用いること(例では、初期化によりまとめている) [例] char astr[][10] = { "ABCD", "EFGHIJ", }; [実行結果の例] すべての文字列の表示 ABCD EFGHIJ すべての文字列の文字の表示 A B C D E F G H I J [ヒント] (1)二次元配列でまとめられた文字列の文字あるいは文字列を表示する関数<返却値型><関数名>(二次元配列の受け渡しに対応した仮引数の宣言、文字列の数) (2)文字列の数を求める。二次元配列のすべての要素に文字列が格納されている場合、文字列の数=二次元配列の要素数(一次元配列の数) =sizeof(astr)/sizeof(astr[0]) ただし、sizeof演算子の生成する型はsize_t型である。 この問題について教えてください。問題丸投げだとは分かっていますがどうしても分かりません。教えてください。ちなみに前回の課題の定義は下の通りです。 void print_all_char(char *chs) { while(*chs!='\0') { printf("%c\n",*chs); chs++; } } よろしくお願いします。

  • outlook express6のText形式ファイルを添付した場合の動作について

    outlook express6で、サンダーバード?というメーラー に、Text形式のファイルを送付すると、以下のような現象が 発生します。 ご存知の方がいらっしゃいましたら、これの解除方法を 教えてください><。 -------------------- 1.outlook express6を使用して、Textファイルを添付 2.サンダーバードのメーラーに人が添付ファイルを開く。 3.ファイルの先頭にヘッダー?らしき文字列、最後にフッター?  らしき文字列が入る。  例. Textファイルの内容は、ABCDEという文字列の場合 ----   <ヘッダー>ABCDE  <フッター> ----  こんな感じになります。 -------------------- ちなみに、outlook express6同士などでは発生しません。 送信形式はテキスト形式を使用しています。

  • "の前に\がついてしまいます

    毎度お世話になります。 テキストエリアに自由に入力させて、その内容をファイルに保存させたいのですが、例えばaタグ <a href="hoge.html"> と入力したデータが、ファイルに保存されると <a href=\"hoge.html\"> となってしまいます。 テキストエリアに入力したデータは、POSTで渡され、改行位置にnl2brで改行記号をつけて一度配列に入れて各配列をtrimで改行を削除し、もう一度文字列に戻してファイルに書き込んでいます。 (入力したデータを1行で保存したいため) このやりかたもどうかと思うのですが、"前の\について回避方法がありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列の取得(BCB6.0)

    初歩的な質問なのですが・・・ テキストファイルから文字列を配列に格納したいです。 テキストファイルからTStringListには取得できているようなのですが。。。 テキストファイルの形式が 文字1 OFF、文字1 ON 文字2 OFF、文字2 ON     … となっており、コンマで区切って2次元配列に格納したいです。 どなたか宜しくお願い致します。 auto_ptr<TStringList> xSList(new TStringList()); xSList->LoadFromFile("D:\\sample.txt"); for(int i=0; i<=xSList->Count; i++) { AnsiString str = xSList->Strings[i];     …(ここで2次元配列に格納したい)

  • PHPでfile()を使った際の配列の要素について

    PHPのfile関数の動作について質問させて頂きます。 テキストファイルからfile()を使って配列に各行のデータを取り込んだのですが、その配列から特定の要素を探そうとしたところ、検出できませんでした。 テキスト.txtの内容------- AAA BBB CCC --------------- $array = file("テキスト.txt"); $word = "AAA"; $keys = array_keys($array,$word); var_dump($keys); 簡略化しましたが、こんな感じで実行するとAAAが格納されているはずの[0]番目のkeyは検出されません。 bar_dumpを使って$array[0]と$wordを確認してみたところ、以下のようなデータが帰ってきました。 $array[0] → string(5) "AAA" $word → string(3) "AAA" まったく同じ文字列なのに、配列の方の長さが2ほど大きくなっています。 そこでtrimを使用してみたところ、配列からこの謎の2バイト?のデータが削除できました。 検索も正しく動作するようになりました。 文末に改行が入ってるのかとも思ったのですが、\nを削除する処理では検索が出来なかったので、不思議に思っております。 テキストファイルから取り込んだ際に、文字列の前か後ろに何らかの文字が入っているのだと思うのですが、実際どのような文字が入っているのでしょうか? ---------------------------------- それともう一つお聞きしたいのですが、 テキストファイル内容がある程度長い(100行以上、または1万文字以上など)場合、file()で配列にデータを取り込むのは負荷が大きかったりするのでしょうか? fgetsで1行ずつ取り出して比較する方法も考えたのですが、処理の繰り返しと取り込むデータの大きさのどちらに配慮するべきか悩んでいます。 もし100行や1万文字が多い・少ないという感覚になる場合、実際「配列にするには大きすぎる」という感覚はどれくらいの容量から考えるべきでしょうか? 後半の質問につきましては明確な答えで無くても、「自分はこう感じる」というような感覚的なご意見でもお聞きしたいと思っています。 お手数をおかけしますが、どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • フォルダ内の複数ファイルから抽出(vbs)

    web のログファイルの集計のため、以下が可能なコードを教えていただきたい。 そのまま使えるコードですと非常に助かります。 (vbs または vba) logというフォルダに、複数のログファイルが入っています。 ファイルの文字コードは、UTF8  改行は、LFです。 この複数のファイルから、特定の文字列の入っている行を抜き出して、 1つのCSVファイルに書き出したい。(文字コードをShift-Jis 改行は、CRLFに変えたい) どうかお助けください。宜しくお願いいたします。

  • 【C++】行列データの読み込み

    C++でテキストファイルに以下のようにカンマ区切り(例なのでスペース等でも構いません)で記述された行列を2次元配列に格納する方法が分かりません。 例 1,2,3 4,5,6 7,8,9 よい方法があればご教授願います。