プロが教える店舗&オフィスのセキュリティ対策術

VBS、素人というか事務部門なので、なじみがなく、
現在、本を見ながら勉強しております。

下記の事務処理を行いたいのですが、どなたか
申し訳ございませんが、ご教授願えませんでしょうか。(VBAにしたいのですが、excel使ってない為、VBS)

入力データは、行単位読込み。
入力データがなくなるまでloopさせてます。
if instr(xxxx,"111") = など検索文字がhitしたら
各Box(配列?)に出力し、各列、111or000~444を
1レコードとして出力させたいのですが、Do~loop
の中の、抜き出し条件をどの様にしてよいのか、
(現在、行読込みで、各出力レコードに出来る222を
ブレークポイントとして、取り合えず作成中…)

知りたい事
□始まりの、000or111、条件処理
 (出力2レコード目無い場合が有るので)
□出力3レコード目、列(4)(5)333,444繰返し処理
 (再度、333,444が出てきた場合)

入力データ+++++
111 
222
333
222
333
000
222
333
444
999
333
444


出力結果イメージ(こうしたい)+++++
列(1),列(2),列(3),列(4),列(5)

111,222,333
,222,333
000,222,333,444,333,444


追記++++++++++
111or000は列(1)(nohitは空白)
222は列(2)
333は列(3)
再度、出てくる333は列(4)
再度、出てくる444は列(5)

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

答えまで出して頂き、有難うございます。
正直、自分ではこのような考えには到底辿り
つきませんでした。
(Do~loopを2回ほど、他、ifがなんだか多すぎて
途中で訳が解からず…。)
今後、BLUEPIXYさんコードを参考に精進致します。
有難うございました。

お礼日時:2006/05/18 13:47

>□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()

補足日時:2006/05/18 10:44
    • good
    • 0

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となります。

補足日時:2006/05/17 13:14
    • good
    • 0

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