Tech-Ezo (Hokkaido PC and Network Users Group)
 Top Page  |  What's Tech-Ezo  |  Next Seminar  |  Seminar Log  |  Seminar Plan  |  Tips  |  life  |  Link  |
Scr.003 ステップアップ WSH - 使えそうなスクリプトを作って見よう
前ページへ   [ステップアップ WSHへ戻る]   次ページへ


■  Level.7  文字列を見つけた行番号を表示する
■ ■

 Level.6までで、検索文字列を含む行の表示はできましたが、いざ、元のテキストファイルを開いてその部分を確認しようと思ってもパッとその行を見つけることが出来ません。そこで、検索文字列を見つけた行がテキストファイルの何行目になるのかを表示して見ることにしました。

行番号を先頭に付ける

 今回の修正ポイントは、テキストファイルを1行ずつ読み込む時にTextStreamオブジェクトによってセットされるLineプロパティをメッセージに付加するだけです。Lineプロパティには現在処理しているテキストファイルの行番号が格納されています。

 実は...あまり大きな声では言えないのですが、勉強会の時には、Lineプロパティを見逃していたため、行カウント用の変数(LineCount)を用意し、1行読み込む度に+1して処理中の行番号を得ていたのでした(汗。...と、いうことで、勉強会に参加した皆さまゴメンナサイ。こっちの方が簡単ですので、Lineプロパティを使った方法もお試し下さい。

level07.vbs
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
Set fso = CreateObject("Scripting.FileSystemObject")
Set src = fso.GetFolder("C:\script\tips")    ' 対象フォルダの指定
Set regEx = New RegExp                       ' 文字列検索用オブジェクトの作成
srhStr = "ファイル"                          ' 検索文字列の指定

regEx.Pattern = srhStr                       ' 検索文字列を検索パターンとして指定
regEx.Global = True                          ' 文字列全体を検索するように指定
regEx.IgnoreCase = True                      ' 大文字・小文字は検索に影響しない

' 指定のフォルダに格納された各ファイルを処理する
For Each FileName In src.Files
    FileEx = fso.GetExtensionName(FileName)  ' ファイル名から拡張子を抜き出す
    If LCase(FileEx) = "txt" Then            ' 拡張子を小文字化してから比較

      ' テキストファイルの内容読み込み処理
        Set TextFile = fso.OpenTextFile(FileName) ' テキストファイルのオープン
        srhLine = FileName & ":" & vbNewLine      ' 検索結果格納用変数の初期化
        srhFlg = 0                                ' 検索ヒットフラグのクリア
        Do Until TextFile.AtEndOfStream
            tmpLine = TextFile.ReadLine             ' 1行読み込み

            If regEx.Test(tmpLine) Then                 ' 指定の文字列を含むか?
                srhLine = srhLine & TextFile.Line - 1 & ":" & tmpLine & vbNewLine
                                                        ' 読み込んだ行のマージ
                srhFlg =1                               ' 検索がヒットしたので1にする
            End If
        Loop

        If srhFlg = 1 Then                              ' 指定の文字列が含まれてたら
            WScript.Echo srhLine
        End If

    End If
Next

' 指定のフォルダに格納された各サブフォルダを処理する
tmpMessage = "フォルダ一覧:" & vbNewLine
For Each FolderName In src.Subfolders
    tmpMessage = tmpMessage & FolderName & vbNewLine
Next
WScript.Echo tmpMessage
※ level6.vbsからの変更箇所(行追加や修正したところ)は行番号をオレンジにしました。

 それでは変更ポイントを見てみましょう。前回までと同様、見易さの為に入れた空行やコメントの説明は省きます。

23〜24行目

019
020
021
022
023
024
025
026
027
        Do Until TextFile.AtEndOfStream
            tmpLine = TextFile.ReadLine             ' 1行読み込み

            If regEx.Test(tmpLine) Then                 ' 指定の文字列を含むか?
                srhLine = srhLine & TextFile.Line - 1 & ":" & tmpLine & vbNewLine
                                                        ' 読み込んだ行のマージ
                srhFlg =1                               ' 検索がヒットしたので1にする
            End If
        Loop

 19行目〜27行目は、テキストファイルを1行づつ読みながら繰り返すループ処理で、その中の23行目では検索がヒットした時に、該当行を表示メッセージの後ろにくっ付けています。この処理を改変し、行の追加に先立って行番号(TextFile.Line & ":")も付加するように修正したのが上記の内容です。。

 ところで、Lineプロパティから1を引いていますが、これはファイルを開いた直後の状態が1となっていて、その後1行読むたびに+1ずつカウントアップされていく仕様なので、実際の行より1多くなっている為です。

 今回はこの1行の修正だけです...(汗

実行してみましょう

 さて、早速実行してみましょう。

level7.vbsファイルをダブルクリックして実行

 Level.6と比べて見るとわかりますが、各行の先頭(左側)に"行番号:"が付いていますね。これで、元のテキストファイルを開いて確認するときは、その行に移動すれば良い状態となりました。例えば、メモ帳で開いたときは[Ctrl]+[g]で行移動すれば1発で該当行に行くことができます。ちょっとだけ便利になりましたよね??(笑。

 今回はここまでです。次回のLevel.8では、今はプログラム内に埋め込まれた、検索文字列と検索対象フォルダを実行の都度入力できるようにしたいと思います。



前ページへ   [ステップアップ WSHへ戻る]   次ページへ
-
※全ては自己責任でお願いします。
※当サイトに関するご連絡は tomomo_c@hotmail.com までお願いします。
最終更新日 2004.4.21