- ベストアンサー
VBS Do~loop内の抜き出し条件について
- VBSのDo~loopを使用して行単位でデータを読み込みながら、特定の条件に合致するデータを抜き出し、列ごとに出力する方法について教えてください。
- 具体的には、特定の文字列がヒットした場合にそのデータを出力する方法や、連続した特定の文字列が続いた場合にそれぞれの列に出力する方法について知りたいです。
- 例えば、条件が「111」の場合に列1に、「222」の場合に列2に、「333」の場合に列3に出力し、もしも再度「333」が出てきた場合には列4に、「444」が出てきた場合には列5に出力したいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もしかして条件が足りないところがあるかも知れませんが、 今まで聞いた条件だと次のような感じでいいと思います。 ---------------------------------------------------------------- Dim fso, fileIn, fileOut Dim inLine, outLine, code, already222 Set fso = CreateObject("Scripting.FileSystemObject") Set fileIn = fso.OpenTextFile("input.txt") Set fileOut = fso.CreateTextFile("output.txt") outLine = "" already222 = False 'レコードに既に222が出現しているかどうかを表す Do Until fileIn.AtEndOfStream inLine = fileIn.ReadLine code = Left(inLine, 3) '行の先頭3文字がコード Select Case code Case "000", "111" If outLine <> "" Then fileOut.WriteLine(outLine) End If outLine = code already222 = False Case "222" If already222 And outLine <> "" Then fileOut.WriteLine(outLine) outLine = "" End If outLine = outLine & "," & code already222 = True Case "333","444" outLine = outLine & "," & code Case Else '999等のコードは無視 End Select Loop If outLine <> "" Then 'データが残っていたら掃き出す fileOut.WriteLine(outLine) End If fileOut.Close fileIn.Close
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>□999 の場合はどうなるのでしょうか? >■999は、333,444が再度出てくる場合のみ、333の直前の行になります。 結局、 質問文の例で言うと、捨てられるということで良いのでしょうか? >000,222,333,444,333,444 では、999は、捨てられているようですが・
補足
引き続きのご質問ありがとうございます。 出力レコードに必要な入力データは 000 111 222 333 444 となります。 999は、2回以上の333,444が出る際、直前に999 が出る為、判別用に使用できるかなと思いまして。 【999は必要なレコードでは有りません。捨てです】 列(1) 000 or 111 or 空白 列(2) 222 列(3) 333 列(4) 444 列(5) 333 列(6) 444 ~ 列(@) 333 ※333,444が複数有る場合。 列(@) 444 ※上記出力レコードのフィード埋め込みの終わりは (1レコード)、次の列(1)000 or 111が出るまで、 及び、222が出るまでとなります。 (000 or 111が必ず出るとは限りません、 000 or 111がなく222からはじまる場合も有り。 その場合、空白を埋め込む) 素人考えですみません。先に出力レコードのレコード 番号を採番する為、ナンバリングさせようと考えてい る所でした。 ただ、2回以上出る場合の333,444の処置、及び、 000,111の処置が難問です。 i = 0 Do Until objin.atendofstream = True linedata_temp = objin.readline() if instr(linedata_temp,"000") or _ instr(linedata_temp,"111") then i = i + 1 objOut.WriteLine i & " " & linedata_temp else ~ end if~ ~ loop objin.close() objOut.close()
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
999 の場合はどうなるのでしょうか? 000, 111, 222, 333, 444 の5種類以外のデータがあるということですか? >if instr(xxxx,"111") = など検索文字がhitしたら 一行のデータは、"111" ではなくて、一部に"111"が含まれるということですか? 列(1),列(2),列(3),列(4),列(5) 000,222,333,444,333,444 でいうと、 再度、出てくる333は列(4) は、列(5) 再度、出てくる444は列(5) は、列(6) のような気がします。 222 は、再度でてくる可能性はないということですよね。
補足
説明が不十分な為、大変お手数をお掛け致します。 □999 の場合はどうなるのでしょうか? ■999は、333,444が再度出てくる場合のみ、333の直前の行になります。 □一行のデータは、"111" ではなくて、一部に"111"が含まれるということですか? ■はい、"111"は読込む行の頭に必ず出てきます。(例:111 ○△□XXXXX~) □再度、出てくる444は列(5) は、列(6) ■申し訳ございません。おっしゃる通りでございます。 再度の333は列(5)、444は列(6)です。 111,222,333 空白,222,333 000,222,333,444,333,444 □222 は、再度でてくる可能性はないということですよね。 ■はい、222の後は、一回以上の222,333となります。
お礼
答えまで出して頂き、有難うございます。 正直、自分ではこのような考えには到底辿り つきませんでした。 (Do~loopを2回ほど、他、ifがなんだか多すぎて 途中で訳が解からず…。) 今後、BLUEPIXYさんコードを参考に精進致します。 有難うございました。