電子書籍の厳選無料作品が豊富!

お世話になります。
よっしです。

VBSで以下のことをしたいのですが、うまくいきません!
ご存知の方教えてください。

・2個のテキストファイル(Text1、Text2(改行あり))の文字列を比較し、同じものが無い場合にその文字列を別ファイルにWriteしたい。

Text1の内容例
 Line1
 Line2
 Line3
 Line4

Text2の内容例
 Line2
 Line3

この場合新規ファイルには以下のように記述したいです。
 Line1
 Line4

配列を使用してちょちょっとできると思ったらなかなか上手くいかず、配列と文字列のFilterをしたら"True"の場合を指定するとエラーが出てしまいます。
一次元の配列のはずなんですが・・・

何か上手くいく方法があれば教えてください!

A 回答 (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
    • good
    • 0
この回答へのお礼

また返事が遅くなってしまいすいません。

上記プログラムで完璧に動いてくれました!
もちろん一つ前のものでも動きました。

本当に助かりました。
どうもありがとうございます。

お礼日時:2005/12/26 10:03

試しに作ってみました。


あまり大きくないファイルだったらこれでいいと思います
-------------------------------------------------------------
'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
    • good
    • 0

#3


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

この回答への補足

お返事が遅くなってすいません。
ありがとうございます。

Text2にあって、Text1にはないというものは原則発生しません。発生すると困ってしまいますので・・・

現在回答いただいたプログラムを拝見させていただいております。ありがとうございます。

補足日時:2005/12/22 09:13
    • good
    • 0

すみません、一行間違えました。

出しなおします。
-- 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();
}
    • good
    • 0

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();
}
    • good
    • 0

結果ファイルの内容は


Line4
Line1
の様に順番は変わってしまってもいいんでしょうか
変わってもいいなら、
作業ファイルとしてText1とText2をソートしたものを用意して
先頭から順に比べて書き出していくというような方法でできます。

小さいファイルなら、Dictionaryオブジェクトを使ってできると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!