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

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

ただいまの
回答率

89.64%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,201

squid_disco

score 12

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

□やりたいこと
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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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/18 10: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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/17 11:46

    lilithchan さん

    迅速にご回答いただきありがとうございます。

    CDate(strDate)を削除し、IF内を"strDate"に変更しましが、
    出力結果は変わらない結果となりました。

    貴重な情報をいただき、ありがとうございます。

    キャンセル

  • 2016/03/17 13:11 編集

    宣言をDim flDate:flDate = False にして

    最後のEndIFの間に以下を入力すれば、期待値が得られるか確認

    If InStr(szBuffer, "個のディレクトリ") <> 0 Then
    objOut.WriteLine "  ファイルサイズ:" & LTrim(Replace(szBuffer, "2 個のディレクトリ", ""))

    fltokyo = False
    flosaka = False
    End IF

    (書き込む箇所を間違えました。申し訳ございません。)

    キャンセル

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • VBScriptに関する質問
  • 初心者です。vbsでテキスト内の指定した日と、必要な情報を抜き出すプログラムが意図した動作になりません。