- PR -

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

投稿者投稿内容
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2007-12-19 11:24
Log Parser 2.2 日本語版
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07
を入れて、ヘルプとかサンプルを見ると、範囲指定とかできると、思いますが。
prime
常連さん
会議室デビュー日: 2007/03/23
投稿数: 22
投稿日時: 2007-12-20 18:13
じゃんぬねっとさん、こあらさん、MMXさん、お答えありがとうございます。

HP等を参考にコードを書いてみました。

コード:

Option Explicit

Dim FS

Dim ScriptMainPath
Dim Logfile1, Logfile2

Dim objFSO
Dim WriteFile, ReadFile
Dim strTxtBuffer
Dim WriteFlg
Dim vbInfomation
Const ForReading = 1
Const ForWriting = 2


Dim objWShell
Dim vbMaximizedFoucus

Dim WSHShell
Dim file
Dim msg

Dim objFileSys
Dim strDeletePath

ScriptMainPath = "C:\temp\"
Logfile1 = "C:\temp\hoge.txt '1~jまでの
Logfile2 = ScriptMainPath & "test\123" '1~10までの数字を抜き出す
Logfile3 = ScriptMainPath & "test\abc" 'a~jまでの数字を抜き出す

Set FS = CreateObject("Scripting.FileSystemObject")

On Error Resume Next

FS.CreateFolder(C:\temp\test)

FS.CreateTextFile(Logfile2 & 1 & ".txt") '1~5の抜き出し
FS.CreateTextFile(Logfile2 & 2 & ".txt") '6~10の抜き出し
FS.CreateTextFile(Logfile3 & 1 & ".txt") 'a~eの抜き出し
FS.CreateTextFile(Logfile3 & 2 & ".txt") 'f~jの抜き出し


Set objFSO = CreateObject("Scripting.FileSystemObject")

if objFSO.FileExists(Logfile1) then
Set objFile = objFSO.GetFile(Logfile1)
if objFile.Size = 0 then
MsgBox "空ファイルです" & vbCrLf & "処理の確認を行って下さい"
else
Set ReadFile = objFSO.OpenTextFile(Logfile1, ForReading)
Set WriteFile = objFSO.OpenTextFile(Logfile2 & 1 & ".log", ForWriting, True)
end if
end if

Set objFSO = nothing

WriteFlg = False

Do While Not ReadFile.AtEndOfStream
strTxtBuffer = ReadFile.ReadLine

if 0 < InStr(strTxtBuffer, "1") Then
WriteFlg = True
end if

if WriteFlg = True then
Call WriteFile.WriteLine(strTxtBuffer)
end if

if 0 < InStr(strTxtBuffer, "5") Then
Exit Do
end if

Loop

ReadFile.Close
WriteFile.Close

Set ReadFile = Nothing
Set WriteFile = Nothing

Const vbMaximizedFocus = 3

set objWShell = CreateObject("WScript.Shell")
objWShell.Run Logfile2 & 1 & ".txt", vbMaximizedFocus, True

Set objWShell = Nothing


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set ReadFile = objFSO.OpenTextFile(Logfile1, ForReading)
Set WriteFile = objFSO.OpenTextFile(Logfile2 & 2 & ".log", ForWriting, True)
Set objFSO = nothing

WriteFlg = False

Do While Not ReadFile.AtEndOfStream
strTxtBuffer = ReadFile.ReadLine

if 0 < InStr(strTxtBuffer, "6") Then
WriteFlg = True
end if

if WriteFlg = True then
Call WriteFile.WriteLine(strTxtBuffer)
end if

if 0 < InStr(strTxtBuffer, "10") Then
Exit Do
end if

Loop

ReadFile.Close
WriteFile.Close

Set ReadFile = Nothing
Set WriteFile = Nothing

Const vbMaximizedFocus = 3

set objWShell = CreateObject("WScript.Shell")
objWShell.Run Logfile2 & 2 & ".txt", vbMaximizedFocus, True

Set objWShell = Nothing

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set ReadFile = objFSO.OpenTextFile(Logfile1, ForReading)
Set WriteFile = objFSO.OpenTextFile(Logfile2 & 3 & ".log", ForWriting, True)
Set objFSO = nothing

WriteFlg = False

Do While Not ReadFile.AtEndOfStream
strTxtBuffer = ReadFile.ReadLine

if 0 < InStr(strTxtBuffer, "a") Then
WriteFlg = True
end if

if WriteFlg = True then
Call WriteFile.WriteLine(strTxtBuffer)
end if

if 0 < InStr(strTxtBuffer, "e") Then
Exit Do
end if

Loop

ReadFile.Close
WriteFile.Close

Set ReadFile = Nothing
Set WriteFile = Nothing

Const vbMaximizedFocus = 3

set objWShell = CreateObject("WScript.Shell")
objWShell.Run Logfile3 & 1 & ".txt", vbMaximizedFocus, True

Set objWShell = Nothing


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set ReadFile = objFSO.OpenTextFile(Logfile1, ForReading)
Set WriteFile = objFSO.OpenTextFile(Logfile2 & 3 & ".log", ForWriting, True)
Set objFSO = nothing

WriteFlg = False

Do While Not ReadFile.AtEndOfStream
strTxtBuffer = ReadFile.ReadLine

if 0 < InStr(strTxtBuffer, "f") Then
WriteFlg = True
end if

if WriteFlg = True then
Call WriteFile.WriteLine(strTxtBuffer)
end if

if 0 < InStr(strTxtBuffer, "j") Then
Exit Do
end if

Loop

ReadFile.Close
WriteFile.Close

Set ReadFile = Nothing
Set WriteFile = Nothing

Const vbMaximizedFocus = 3

set objWShell = CreateObject("WScript.Shell")
objWShell.Run Logfile3 & 2 & ".txt", vbMaximizedFocus, True

Set objWShell = Nothing

MsgBox "処理が完了しました。" & vbCrLf & "Enterキーを押して下さい。", vbInfomation, "抜き出し作業"


Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")

file = Fs.BuildPath(WSHShell.SpecialFolders("test"),"C:\temp\test\*.txt")

msg = MsgBox ("ファイルを全て消します。よろしいですか?")
If msg = vbNo Then Wscript.Quit
Fs.DeleteFile file


Set objFileSys = CreateObject("Scripting.FileSystemObject")

strDeletePath = "C:\temp\test"

msg = MsgBox ("フォルダを削除します。よろしいですか?")
If msg = vbNo Then Wscript.Quit

objFileSys.DeleteFolder strDeletePath

set objFileSys = Nothing



一応、一通り作ってみました!
スクリプトはあまりやったことがなかったんですが、なんとなくでやってみました。

だけど、自分の限度があって分からないところが出てきました。
こういう場合はどうするのか?という場面を考えて作ったのですが逆にチンプンカンプンになっちゃいました・・・(@@;

@で1~10までとa~jまでとキャンセルの3通りがあって、ダイアログ上で選択ボタンを作って、
->1~10までを処理します。
->a~jまでを処理します。
->キャンセル
というようなプログラムを作る手順をHP上で調べましたがわかりませんでした。

Aは3通りを考えました。
1、ファイルが無かった場合 -> エラーを出して作業の終了
2、ファイルはあるのに中身が空っぽの場合 -> エラーを出して、作業を停止させる(エラー以降の作業を進ませない)
3、ファイルが正常だった場合 -> 処理を続行

1はスクリプト上でエラーが出るのでOKなのですが、2はif文で「空ファイルです」と定義しました。
ですが、3を続行させるときにBへ導く書き方がわかりませんでした。

Bは@のダイアログで抜き出し処理の分岐ボタンをポチっと押して、抜き出しの処理に反映させる書き方がわかりませんでした。

かなり力技になってしまたのですが、ご教授の程よろしくおねがいします!

[ メッセージ編集済み 編集者: prime 編集日時 2007-12-26 03:11 ]
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-12-20 18:44
> かなり力技
むむむ、なんという。
ひとまず、同じようなコードを関数化したらスッキリすると思いますよ。

> 分岐ボタンをポチ
MsgBoxでもInputBoxでも良いんじゃないですか?

> スクリプトはあまりやったことがなかったんですが
構造化プログラミングとか、そういうのも見てみるべきかもしれません。


[追記]
それから、掲示されているコードだけだと、
どういう仕様なのか意図をくみ取ることが難しいです。

例えば、以前の私の書き込みのように、
言葉で、どんな処理をさせたいのか整理することも有効だと思います。
引用:

入力ファイルを順次読み込み、"開始条件"という文字列を含んだ行から、
"終了条件"という文字列を含んだ行まで、を出力します。


以上ご参考まで。
[/追記]


[ メッセージ編集済み 編集者: こあら 編集日時 2007-12-20 18:50 ]
prime
常連さん
会議室デビュー日: 2007/03/23
投稿数: 22
投稿日時: 2007-12-26 04:01
引用:

こあらさんの書き込み (2007-12-20 18:44) より:
> かなり力技
むむむ、なんという。
ひとまず、同じようなコードを関数化したらスッキリすると思いますよ。

> 分岐ボタンをポチ
MsgBoxでもInputBoxでも良いんじゃないですか?

> スクリプトはあまりやったことがなかったんですが
構造化プログラミングとか、そういうのも見てみるべきかもしれません。


[追記]
それから、掲示されているコードだけだと、
どういう仕様なのか意図をくみ取ることが難しいです。

例えば、以前の私の書き込みのように、
言葉で、どんな処理をさせたいのか整理することも有効だと思います。
引用:

入力ファイルを順次読み込み、"開始条件"という文字列を含んだ行から、
"終了条件"という文字列を含んだ行まで、を出力します。


以上ご参考まで。
[/追記]


[ メッセージ編集済み 編集者: こあら 編集日時 2007-12-20 18:50 ]




えっと、こあらさんのコードを使って以下のような処理をスクリプトで行いたいです。
◎やりたい事
1、ファイル作成

2、フォルダ作成

3、ファイルの確認(C:\temp\hoge.txt)
@ファイルが無い場合、処理の終了
Aファイルはあるが0Byteの場合、処理の終了
Bファイルがある場合は、次の処理へ

4、処理の分岐
@1~10までの文字の抜き出しを選択
 1)1~2の文字を抜き出す
 2)3~4の文字を抜き出す
 3)5~8の文字を抜き出す
 4)9~10の文字を抜き出す
Aa~jまでの文字の抜き出しを選択
 1)a~bの文字を抜き出す
 2)c~dの文字を抜き出す
 3)e~hの文字を抜き出す
 4)i~jの文字を抜き出す

※どちらか一方の処理を選択した場合、もう一方は処理を実行しない。

5、ファイル削除

6、フォルダ削除


◎問題点
1、同じようなコードを関数化にする方法が不明
2、抜き出し処理の分岐をする際、MsgBox関数でどちらか一方の処理を選択する方法が不明
3、ファイルの確認のところで、なぜか「オブジェクトがありません:"」というエラー処理の改善方法が不明。

以上です。

「教えて君」になってしまって申し訳ないのですが、ご教授頂けないでしょうか?
まだまだ、私自身が勉強不足でした・・・おねがいします(;_;

[ メッセージ編集済み 編集者: prime 編集日時 2007-12-26 04:09 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-12-26 09:22
しっかりとは読んでいませんが。

引用:

primeさんの書き込み (2007-12-26 04:01) より:

1、同じようなコードを関数化にする方法が不明


戻り値を返さない関数ならば Sub、戻り値を返す関数ならば Function ですね。 Class も使えますから Script 言語と言えどもいろいろできます。 実際のコードを見てもらった方がわかりやすいと思います。(参考)

引用:

2、抜き出し処理の分岐をする際、MsgBox関数でどちらか一方の処理を選択する方法が不明


MsgBox 関数ならば戻り値というのが扱えます。

コード:

    If MsgBox("1 + 1 は 2 ですか?", vbYesNo Or vbQuestion, "やらないか?") = vbYes Then
        Call MsgBox("そうですね")
    Else
        Call MsgBox("違いますね")
    End If


とかですね。

引用:

3、ファイルの確認のところで、なぜか「オブジェクトがありません:"」というエラー処理の改善方法が不明。


実際どのオブジェクトが存在していないかで対処が変わります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-12-27 14:41
引用:

◎やりたい事
1、ファイル作成

2、フォルダ作成

3、ファイルの確認(C:\\temp\\hoge.txt)
@ファイルが無い場合、処理の終了
Aファイルはあるが0Byteの場合、処理の終了
Bファイルがある場合は、次の処理へ

4、処理の分岐
@1~10までの文字の抜き出しを選択
 1)1~2の文字を抜き出す
 2)3~4の文字を抜き出す
 3)5~8の文字を抜き出す
 4)9~10の文字を抜き出す
Aa~jまでの文字の抜き出しを選択
 1)a~bの文字を抜き出す
 2)c~dの文字を抜き出す
 3)e~hの文字を抜き出す
 4)i~jの文字を抜き出す

※どちらか一方の処理を選択した場合、もう一方は処理を実行しない。

5、ファイル削除

6、フォルダ削除


プログラム仕様としては、コードを書けるレベルまで詰まったみたいですね。
今度は、もう少し前提に戻って要件まで詰めてみて下さい。
このスクリプトはどんな場面で使うのですか?

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