質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

2回答

3739閲覧

初心者です。vbsでテキスト内の指定した日と、必要な情報を抜き出すプログラムが意図した動作になりません。

squid_disco

総合スコア14

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2016/03/17 02:08

編集2016/03/17 02:49

初心者です。質問のレベルが低く申し訳ございません。

□やりたいこと
Samplehelpe.txtに記載された必要な情報を、日付を指定して、任意の文字列を
出力したいと考えています。

・日付の指定はinputBoxを利用して、代入
・必要な情報はDo While文を使用し、ReadLineで読み込んだ内容をobjOut.WriteLineにて書き出し

getlog.txt

2016/01/01: 取得した日

・/data/japan/tokyo
2016/01/01: 取得した日
ファイルサイズ: 1200バイトの空き領域
・/data/japan/osaka
2016/01/01: 取得した日
ファイルサイズ: 1100バイトの空き領域

このような情報がほしい


□現在の状況

getlog.txt

他の日付の情報も出力されてしまう。

2016/01/01: 取得した日

・/data/japan/tokyo
2016/01/01: 取得した日
ファイルサイズ: 1200バイトの空き領域
・/data/japan/osaka
2016/01/01: 取得した日
ファイルサイズ: 1100バイトの空き領域

(ここからの情報がいらない)
2 個のディレクトリ 600 バイトの空き領域
2 個のディレクトリ 1000 バイトの空き領域

(サンプルは2日のみだが、本番ではいらない日の情報が5000行表示されてしまう。)


以下が読み込む対象のテキストです。

samplehelp.txt
-------------------------- 2016/01/01 : 15:02:22.90 --------------------------

<文字列の羅列>

C:\japan\tokyo のディレクトリ(←抜き出したい情報)

<文字列の羅列>

2016/01/01(←抜き出したい情報) 15:01 100 JBtoBLD.RV.URIAGEDT
1 個のファイル 100 バイト
2 個のディレクトリ 1200 バイトの空き領域(←抜き出したい情報)

<文字列の羅列>

C:\japan\osaka のディレクトリ(←抜き出したい情報)

<文字列の羅列>

2016/01/01(←抜き出したい情報) 15:01 100 JBtoBLD.RV.URIAGEDT
1 個のファイル 100 バイト
2 個のディレクトリ 1100 バイトの空き領域(抜き出したい情報)

-------------------------- 2016/01/02 : 15:02:22.90 --------------------------

<文字列の羅列>

C:\japan\tokyo のディレクトリ

<文字列の羅列>

2016/01/02 15:01 200 JBtoBLD.RV.URIAGEDT
1 個のファイル 200 バイト
2 個のディレクトリ 600 バイトの空き領域

<文字列の羅列>

C:\japan\osaka のディレクトリ

<文字列の羅列>

2016/01/02 15:01 100 JBtoBLD.RV.URIAGEDT
1 個のファイル 100 バイト
2 個のディレクトリ 1000 バイトの空き領域


以下が作成中のプログラムです。

getlog_helpe.vbs

Option Explicit

' **********************************************************
' オブジェクト作成
' **********************************************************

Dim objFso:Set objFso = CreateObject("Scripting.FileSystemObject")
Dim objShell:Set objShell = WScript.CreateObject("WScript.Shell")

Dim szPath:szPath = WScript.ScriptFullName
szPath = objFso.GetParentFolderName(szPath)

Dim tokyo:tokyo = False
Dim osaka:osaka = False
Dim fso
Dim flDate:flDate = False
Dim szBuffer
Dim strDate
Dim dtmDate

' **********************************************************
' ファイルオープン
' **********************************************************

Dim objIn:Set objIn = objFso.OpenTextFile(szPath & "\putlog.txt", 1)
If Err.Number <> 0 then
MsgBox (Err.Description)
WScript.Quit
End If

Dim objOut:Set objOut = objFso.OpenTextFile(szPath & "\getlog.txt", 2, True)

' **********************************************************
' 日付の入力
' **********************************************************

strDate = InputBox("月日を入力してください。",2016/01/01)
If IsDate(strDate) Then
dtmDate = CDate(strDate)

Else MsgBox "正しい日付を入力してください。"

End If

msgBox dtmDate

' **********************************************************
'入力型式「YYYY/MM/DD」にて指定した日のみ書き出すテキスト
'取得データの「空き領域のバイト数値を書きだすテキスト


do While not objIn.AtEndOfStream
szBuffer = objIn.ReadLine'ReadLineにてputlog.textを一行ずつ読み込む

If InStr(szBuffer,dtmDate) <> 0 Then 'dtmDate(inputBoxにて入力した日付)があった場合、 objOut.WriteLine dtmDate&": 取得した日" '日付と": 取得した年月日"を書き出し End If If InStr(szBuffer, "C:\japan\tokyo のディレクトリ") <> 0 Then 'C:\japan\tokyo のディレクトリの文字列があった場合 tokyo = True objOut.WriteLine "" objOut.WriteLine " ・/data/japan/tokyo"'・/data/japan/tokyo"を書き出し 'MsgBox "tokyo" End If If InStr(szBuffer, "C:\japan\osaka のディレクトリ") <> 0 Then '"C:\japan\osaka のディレクトリ"の文字列があった場合 osaka = True objOut.WriteLine "" objOut.WriteLine " ・/data/japan/osaka"'・/data/japan/osakaを書き出し ' MsgBox "Kyorindo" End If If InStr(szBuffer, dtmDate) = (tokyo = True Or osaka = True) Then'tokyo及びosakaがTrueの場合 flDate = True'flDateをTrueにする ' MsgBox Date() End If ' ファイルサイズの取得 If flDate = True And InStr(szBuffer, "個のディレクトリ") <> 0 Then 'fiDateがTrue及び"個のディレクトリ"の文字列があった場合 objOut.WriteLine " ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", ""))'この文字列を書き出し End If

loop

' **********************************************************
' ファイルクローズ
' **********************************************************
objOut.Close
objIn.Close

長くなり申し訳ございませんが、指定した日のみ、必要な情報をテキストに出力する
には、どのようにすればよろしいでしょうか。
ご教授いただきたく存じます。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

対象の日付を見つけたかの判定が

If InStr(szBuffer, dtmDate) = (tokyo = True Or osaka = True) Then'tokyo及びosakaがTrueの場合

だとすると、まずここが問題です。

InstrはszBufferの中から見つけたdtmDateの文字の位置をかえしますが、その比較相手がTrue/Falseとなっており、なにを判別したいのかよくわからないことになっています。

そしてもう一つの問題が、「tokyo」や「osaka」、「個のディレクトリ」の文字を見つけたらすぐに(日付に関わらず)WriteLineしてしまっているところです。
このため意図しない日付の情報でも関係なく出力されてしまっています。

というわけで、改善点は
・日付の判定を正しく行う。
・tokyo/osakaを見つけても日付を確認するまでは出力しない。
(ディレクトリの文字を見つけた時点で対象日のtokyo/osakaなら出力する)
の2つです。

Option Explicit ' ****************************************************** ' オブジェクト作成 ' ****************************************************** Dim objFso:Set objFso = CreateObject("Scripting.FileSystemObject") Dim objShell:Set objShell = WScript.CreateObject("WScript.Shell") Dim szPath:szPath = WScript.ScriptFullName szPath = objFso.GetParentFolderName(szPath) Dim tokyo:tokyo = False Dim osaka:osaka = False Dim fso Dim flDate:flDate = False Dim szBuffer Dim strDate Dim dtmDate ' ****************************************************** ' ファイルオープン ' ****************************************************** 'msgbox szPath 'WScript.Quit Dim objIn:Set objIn = objFso.OpenTextFile(szPath & "\putlog.txt", 1) If Err.Number <> 0 then MsgBox (Err.Description) WScript.Quit End If Dim objOut:Set objOut = objFso.OpenTextFile(szPath & "\getlog.txt", 2, True) ' ****************************************************** ' 日付の入力 ' ****************************************************** strDate = InputBox("月日を入力してください。",2016/01/01) If IsDate(strDate) Then dtmDate = CDate(strDate) Else MsgBox "正しい日付を入力してください。" End If msgBox dtmDate Dim iCnt:iCnt = 0 '行番号(DBG用) ' ****************************************************** '入力型式「YYYY/MM/DD」にて指定した日のみ書き出すテキスト '取得データの「空き領域のバイト数値を書きだすテキスト ' ****************************************************** do While not objIn.AtEndOfStream iCnt = iCnt + 1 '行番号(DBG用) szBuffer = objIn.ReadLine'ReadLineにてputlog.textを一行ずつ読み込む If InStr(szBuffer, CStr(dtmDate)) > 0 Then 'dtmDate(inputBoxにて入力した日付)があった場合、 'objOut.WriteLine dtmDate&": 取得した日" '日付と": 取得した年月日"を書き出し flDate = true MsgBox iCnt & " date:" & CStr(dtmDate) End If If InStr(szBuffer, "C:\japan\tokyo のディレクトリ") <> 0 Then 'C:\japan\tokyo のディレクトリの文字列があった場合 tokyo = True 'objOut.WriteLine "" 'objOut.WriteLine " ・/data/japan/tokyo"'・/data/japan/tokyo"を書き出し MsgBox iCnt & " tokyo" End If If InStr(szBuffer, "C:\japan\osaka のディレクトリ") <> 0 Then '"C:\japan\osaka のディレクトリ"の文字列があった場合 osaka = True 'objOut.WriteLine "" 'objOut.WriteLine " ・/data/japan/osaka"'・/data/japan/osakaを書き出し MsgBox iCnt & " osaka" End If 'If InStr(szBuffer, dtmDate) = (tokyo = True Or osaka = True) Then'tokyo及びosakaがTrueの場合 ' flDate = True'flDateをTrueにする ' MsgBox Date() 'End If ' ファイルサイズの取得 'If flDate = True And InStr(szBuffer, "個のディレクトリ") <> 0 Then 'fiDateがTrue及び"個のディレクトリ"の文字列があった場合 ' objOut.WriteLine " ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", ""))'この文字列を書き出し 'End If If (tokyo = True Or osaka = True) And InStr(szBuffer, "個のディレクトリ") > 0 Then 'tokyo/osakaが見つかっており、及び"個のディレクトリ"の文字列があった場合 If flDate = true Then objOut.WriteLine dtmDate&": 取得した日" '日付と": 取得した年月日"を書き出し If tokyo = True Then objOut.WriteLine "" objOut.WriteLine " ・/data/japan/tokyo"'・/data/japan/tokyo"を書き出し End If If osaka = True Then objOut.WriteLine "" objOut.WriteLine " ・/data/japan/osaka"'・/data/japan/osakaを書き出し End If objOut.WriteLine " ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", ""))'この文字列を書き出し MsgBox iCnt & " dir" End If tokyo=false osaka=false flDate = false End If loop ' ****************************************************** ' ファイルクローズ ' ****************************************************** objOut.Close objIn.Close

投稿2016/03/17 07:43

編集2016/03/17 07:45
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

squid_disco

2016/03/18 01:02

jawaさん 大変ありがとうございます。 いただきました以下のアドバイスにて、問題が解決いたしました。 日付の判定を正しく行う。 tokyo/osakaを見つけても日付を確認するまでは出力しない。 (ディレクトリの文字を見つけた時点で対象日のtokyo/osakaなら出力する)の2つです。 以下、作成した処理 do While not objIn.AtEndOfStream szBuffer = objIn.ReadLine If InStr(szBuffer, "C:japan\tokyo のディレクトリ") <> 0 Then'tokyoをみつけても、書き込まない fltokyo = True End If If InStr(szBuffer, "C:japan\osaka のディレクトリ") <> 0 Then 'osakaをみつけても、書き込まない flosaka = True End If If InStr(szBuffer,dtmDate) And (fltokyo = True Or flosaka = True) Then flDate = True ' MsgBox Date() End If ' ファイルサイズの取得 If flDate = True And InStr(szBuffer, "個のディレクトリ") <> 0 Then 'ここでまとめて書き出し objOut.WriteLine dtmDate objOut.WriteLine " ・/data/shiseido/東京" objOut.WriteLine "  ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", "")) objOut.WriteLine " ・/data/shiseido/大阪" fltokyo = False flosaka = False flDate = False
guest

0

入力した日付をCDate(strDate)しているのが原因と思います。
CDateした結果を文字列にした場合、YYYY/MM/DDにはならないと思います。
よって、Instrで比較している箇所の挙動がおかしくなっているのではないでしょうか。

投稿2016/03/17 02:31

lilithchan

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

squid_disco

2016/03/17 02:46

lilithchan さん 迅速にご回答いただきありがとうございます。 CDate(strDate)を削除し、IF内を"strDate"に変更しましが、 出力結果は変わらない結果となりました。 貴重な情報をいただき、ありがとうございます。
squid_disco

2016/03/17 04:14 編集

宣言をDim flDate:flDate = False にして 最後のEndIFの間に以下を入力すれば、期待値が得られるか確認 If InStr(szBuffer, "個のディレクトリ") <> 0 Then objOut.WriteLine "  ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", "")) fltokyo = False flosaka = False End IF (書き込む箇所を間違えました。申し訳ございません。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問