- PR -

開始行から終了行の文字列を抜き出す

投稿者投稿内容
バルサン
会議室デビュー日: 2007/04/16
投稿数: 6
投稿日時: 2007-12-12 02:36
宜しく御願いします。

サーバのバックアップ作業で、フルバックアップ時のログと通常バックアップ時のログの文字列を抜き出す作業を手動で実施しており、それをVBSで出来るか模索中です。
(プログラムに関しては全くの初心者です・・・)

ログの開始行から終了行までの間を抜き出せるように、Webを参照しながら作成してみました。

Const ForReading = 1
Const ForWriting = 2

Set objFSo = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("Reading.log", ForReading)

strContents = objFile.ReadAll
objFile.Close

arrLines = Split(strContents, vbCrLf)

Set objFile = objFSO.OpenTextFile("Writing.txt", ForWriting, True)


For i = 0 to UBound(arrLines)

intMatch = InStr(arrLines(i), "検索する文字を指定")

If intMatch > 0 Then

objFile.WriteLine arrLines(i-1)
objFile.WriteLine arrLines(i)

End If

Next

objFile.Close

MsgBox "処理終了"

上記のスクリプトだと開始行と終了行しか取れず、その間の行が全く取得できない事がわかりました・・・

また、フルバックアップと標準バックアップのどちらかを選択出来るように条件分岐をさせたいのですが、上記のスクリプトと掛け合わせる事が出来ません・・・

VB関係に詳しい人間が周りにいない為、途方にくれており非常に困っております。
私事で申し訳ないのですが、どなたかご教授頂けないでしょうか・・・?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-12 10:12
引用:

バルサンさんの書き込み (2007-12-12 02:36) より:

上記のスクリプトだと開始行と終了行しか取れず、その間の行が全く取得できない事がわかりました・・・


単に条件にマッチしていなかっただけではないでしょうか。 同じ行を複数回検索しないようですから。 と考えると 1 行がやたらと長い数行程度の log ファイルだったりしますか?

引用:

また、フルバックアップと標準バックアップのどちらかを選択出来るように条件分岐をさせたいのですが、上記のスクリプトと掛け合わせる事が出来ません・・・


手動で良いのであれば MsgBox 関数。 それがダメならばコマンドライン引数が利用できるのではないでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-12-12 10:15
私はいつも(ReadAllでは無く)ReadLineを使っています。

コード:
oFilesys.CreateTextFile("write.txt")
Set wFile = oFilesys.OpenTextFile("write.txt", ForWriting)
Set rFile = oFilesys.OpenTextFile("read.txt", ForReading)

Do While Not rFile.AtEndOfStream
   s = rFile.ReadLine
   wFile.WriteLine s
Loop

rFile.Close
wFile.Close


上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2007-12-12 10:50
引用:

バルサンさんの書き込み (2007-12-12 02:36) より:

上記のスクリプトだと開始行と終了行しか取れず、その間の行が全く取得できない事がわかりました・・・


↑単に開始行と終了行以外は、その検索文字列が入っていないだけかと。
例えば検索文字列に『バックアップジョブ』とあっても、ジョブの開始と終了で
『バックアップジョブの開始』・『バックアップジョブは終了コード??で終了
しました。』となっており、途中のログはジョブIDでロギングされているタイプ
では無いかと推測します。

コード:
    Set objFileSys = CreateObject("Scripting.FileSystemObject")
    Set objParmFile = objFileSys.OpenTextFile("Param.txt", 2, True, -2)
    Set objIputFile = objFileSys.OpenTextFile("Reading.log", 2, True, -2)
    Set objOputFile = objFileSys.OpenTextFile("Writing.txt", 1, True, -2)

    strParam1 = objParmFile.ReadLine
    strParam2 = objParmFile.ReadLine

    Set objParmFile = Nothing

    Do While Not objIputFile.AtEndOfStream
        strTxtBuffer = objIputFile.ReadLine

        If (0 < inStr(strTxtBuffer, strParam1)) Then
            objOputFile.WriteLine = strTxtBuffer

            Do While Not objIputFile.AtEndOfStream
                strTxtBuffer = objIputFile.ReadLine

                If (0 < inStr(strTxtBuffer, strParam2)) Then
                    objOputFile.WriteLine = strTxtBuffer
                    Exit Do
                End If

                strTxtBuffer = vbNullString
            Loop
        End If

        strTxtBuffer = vbNullString
    Loop

    Set objIputFile = Nothing
    Set objOputFile = Nothing

    MsgBox "処理終了"



上記のParam.txtにはDOSのバッチか何かで、検索文字列(一行目に検索開始文字列を
二行目に検索終了文字列を)書き込んで下さい。
バルサン
会議室デビュー日: 2007/04/16
投稿数: 6
投稿日時: 2007-12-13 03:16
上総さん、こあらさん、じゃんぬねっとさん、ご返答有難う御座いました。

じゃんぬねっとさん
文字がマッチングしていない、文字の超過に関しては問題ありませんでした。

こあらさん
コピーペーストをして、拡張子をvbsに変換して使用したのですが、うまくいきませんでした。

上総さん
バックアップログの中身を以下に記します。
・「○○バックアップ_YYYYMMDD.log」を作成します。
・バックアップを開始します。  ←開始行(開始文字列)
・YYYYMMDDにスタートしました。
中略
・YYYYMMDDに終了しました。   ←終了行(終了文字列)
・「○○バックアップ_YYYYMMDD.log」はC:\aaa\bbb\cccに保存しました。

上総さんが書いて下さったコードを、vbsの中に貼り付け、param.txtをbatに変換して開始行から終了行の「・YYYYMMDDにスタートしました。」と「中略」をコピーペーストしたのですが、うまくいきませんでした・・・


例えば、以下のようなスクリプトを作成する事は可能でしょうか?

・フルバックアップのログを取得 -[1]
・標準バックアップのログを取得 -[2]

[1]の場合
・ファイルパスを指定
・開始行を指定
・終了行を指定
※開始行から終了行までの間の行も取得出来る様に設定
・抜き出した文字を新たにテキストを作成 (テキスト名:フルバックアップ_YYYYMMDD_抜き出し.log)
・別フォルダのパスを指定し、テキストを保存する。

[2]の場合
[1]と同じ
※テキスト名や抜き出す文字に変動あり


文章がすごくわかりにくくてすみません。今回ばかりは自分の力で解決が困難なので、宜しく御願いします・・・
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-12-13 09:39
引用:

バルサンさんの書き込み (2007-12-12 02:36) より:
For i = 0 to UBound(arrLines)

intMatch = InStr(arrLines(i), "検索する文字を指定")

If intMatch > 0 Then

objFile.WriteLine arrLines(i-1)
objFile.WriteLine arrLines(i)

End If

Next



上記は、ファイルへの出力箇所のソースコードの抜粋ですが、
この内容と以下の説明には矛盾があるように思います。

引用:

バルサンさんの書き込み (2007-12-12 02:36) より:
上記のスクリプトだと開始行と終了行しか取れず、その間の行が全く取得できない事がわかりました・・・



この説明を文字通り捉えると、ファイルがN行で構成されているとして
開始行=1行目、終了行=N行目ですから、配列arrLinesのインデックスでいうと
0行目と(N-1)行目のみが取れたということになります。

しかし、開始行(i=0)でマッチすると
コード:
objFile.WriteLine arrLines(i-1)


が実行されるはずなので、配列の範囲外のアクセスでエラーになるはずです。

仮に開始行と終了行の2行しかなく、かつ、終了行だけがマッチした場合、
開始行と終了行の2行が取れます。

つまり、ソースコードとその実行結果の説明に矛盾がないとすれば、
ログは開始行と終了行の2行しかなく、マッチしたのは終了行だけということになるのではないでしょうか。

この辺から確認して欲しいところとしては以下のようなところかなと思います。

・改行コードは間違いなくCR+LFか?
→改行コードが違えば、Split関数の処理で期待しない結果になっているでしょう。
・文字コードはShift-JISか?
→文字コードが違えば、マッチすると期待されるものでもマッチするとは言えない。
・じゃんぬねっとさんのコメントに対するレス
 「文字がマッチングしていない、文字の超過に関しては問題ありませんでした。 」
 はどのように確認したか?
→確認方法に問題がないか、確認した方法を記載した方がよい。
・ソースコードの途中にMsgBoxを使った行を差し込んでデバッグしてみる
 →例えば、
コード:
   arrLines = Split(strContents, vbCrLf) 
   MsgBox UBound(arrLines)


のような感じで処理で重要そうな変数が自分の期待通りの値になっているかを
確認しましょう。
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2007-12-13 10:24
バルサンさん、すいません提示しているソースにミスがあった為、修正後のソースを
再掲します。

コード:

Set objFileSys = CreateObject("Scripting.FileSystemObject")
Set objParmFile = objFileSys.OpenTextFile("Param.txt", 1, True, -2)
Set objIputFile = objFileSys.OpenTextFile("Reading.log", 1, True, -2)
Set objOputFile = objFileSys.OpenTextFile("Writing.txt", 2, True, -2)

strParam1 = objParmFile.ReadLine
strParam2 = objParmFile.ReadLine

Set objParmFile = Nothing

Do While Not objIputFile.AtEndOfStream
strTxtBuffer = objIputFile.ReadLine

If (0 < InStr(strTxtBuffer, strParam1)) Then
Call objOputFile.WriteLine(strTxtBuffer)

Do While Not objIputFile.AtEndOfStream
strTxtBuffer = objIputFile.ReadLine

Call objOputFile.WriteLine(strTxtBuffer)

If (0 < InStr(strTxtBuffer, strParam2)) Then
Exit Do
End If

strTxtBuffer = vbNullString
Loop
End If

strTxtBuffer = vbNullString
Loop

Set objIputFile = Nothing
Set objOputFile = Nothing

MsgBox "処理終了"



修正点
・ファイルモードが反転していた為修正
・開始文字列検出後のループ内での処理を修正
 (開始文字列検出後、終了文字列検出までを書き込むように修正)
・WriteLine関数の使用方法に誤りがあった為修正

テストで使用したデータも掲載します。
Param.txtの中身
コード:

バックアップを開始
バックアップを終了



Reading.logの中身
コード:





バックアップを開始




バックアップを終了

10
11



Writing.txtの中身
コード:

バックアップを開始




バックアップを終了



取りあえずログの抽出はこれでよいかと思います。

[ メッセージ編集済み 編集者: 上総 編集日時 2007-12-13 10:25 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-12-13 10:44
激しく勘違いしていたようですorz
(上総さんの投稿を見て、やっと理解しました。)

引用:

よねKENさんの書き込み (2007-12-13 09:39) より:



の指摘はポイントがずれてますので、
無視してください。

スキルアップ/キャリアアップ(JOB@IT)