○ ログファイルを解析するアプリのひな型をVB6で作る

ログファイルとして作成したCSVファイルを解析する必要が出てきた時に、いちいちアプリを作成するのが面倒です。
そのため、すぐに作成できるひな型を作成します。

そこで、最低限必要な機能として
1 解析するファイルはフォームのテキストにドラッグするとファイル名が表示される
2 解析ボタンを押すとファイルを1行毎に読み込んで処理する
3 読み込んだ1行はカンマ毎に分割される
4 出力結果はText2に出力する
このような機能が必要そうです。



フォームにテキストボックス2個とボタンを張り付けます。
Text2 は解析結果を出力するので、デザイン時に MultiLine を True に設定して複数行が表示できるようにしておきます。
ScrollBars も 2-垂直 に設定した方が解析結果が見やすくなると思います。

Windows10では開発環境の実行ボタンではドラッグが動きませんでした。
実行ファイルを作成して動かすとドラッグが動作します。
デバック時にはファイル名を直接指定する必要がありそうです。

次のコードを書き込みます

Option Explicit

Private Sub Form_Load()
    Command1.Caption = "解析"
    Text1.Text = "ファイルをドラッグしてください"
    Text2.Text = "解析結果"
    'Text1にファイルをドラッグできるようにする
    Text1.OLEDropMode = vbOLEDropManual
End Sub

'ドラッグされたファイル名を表示する
Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Text1.Text = Data.Files(1)
End Sub

Private Sub Command1_Click()
    Dim filename As String
    Dim fileNum As Integer
    Dim buf As String
    Dim ar As Variant
    
    Text2.Text = ""
'    デザイン時にはドラッグが動かないためデバッグの為にファイルを直接指定する必要がある
'    Text1.Text = "C:\Users\test\Desktop\test.csv"
    filename = Text1.Text

    fileNum = FreeFile()
    Open filename For Input As #fileNum
    
    'csvファイルを1行毎に読み込み
    Do Until EOF(fileNum)
        Line Input #fileNum, buf
        ar = Split(buf, ",")
        '区切り文字 , で切り出されて、ar(0)〜に値が入ってくる

        'この中で解析してtext2に結果を出力









    Loop

    Close #fileNum
End Sub

これで、アプリのひな型ができました。
コードを改造しまくって解析に利用します。

解析では、時間の "00:00:00" の ":" を削除してLong値として処理したい場合には。
Dim time_pos As Long
time_pos = CLng(Replace(ar(1), ":", ""))
このようにすると大小関係の比較しかできないですが値に変換する事ができます。

Text2に複数行で出力するには
Text2.Text = Text2.Text + " " + vbCrLf
このように改行文字を付け加えると改行できます。


■ 複数のファイルを処理できるようにする

ファイルが複数個の場合、一つずつドラッグして処理して集計するのは面倒でしかありません。
そこで、複数個のファイルをドラッグできるようにします。
Formにファイルドラッグ用のText1と結果出力のText2と開始ボタンのCommand1を貼り付けました。
ドラッグ先のTextBox1のデザイン時に MultiLine を True に設定して複数行が表示できるようにします。
ScrollBars も設定しておいた方がいいかもしれません。

以下のコードを張り付けました。
Option Explicit

Private Sub Form_Load()
    Command1.Caption = "解析"
    Text1.Text = "ファイルをドラッグしてください"
    Text2.Text = "解析結果"
    'Text1にファイルをドラッグできるようにする
    Text1.OLEDropMode = vbOLEDropManual
End Sub

'ドラッグされたファイル名を表示する
Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Text1.Text = ""
    Dim i As Long
    For i = 1 To Data.Files.Count
        Text1.Text = Text1.Text + Data.Files(i) + vbCrLf
    Next i
End Sub

Private Sub Command1_Click()
    Dim i As Long
    Dim fileNum As Integer
    Dim buf As String
    Dim ar As Variant
    Dim FileNameAr As Variant
    
    Text2.Text = ""
'    デザイン時にはドラッグが動かないためデバッグの為にファイルを直接指定する必要がある
'    Text1.Text = "C:\Users\test\Desktop\test.csv"
    FileNameAr = Split(Text1.Text + vbCrLf, vbCrLf)
    For i = LBound(FileNameAr) To UBound(FileNameAr)
        If FileNameAr(i) <> "" And FileNameAr(i) <> vbNull Then
            fileNum = FreeFile()
            On Error GoTo FileOpenErr
            Open FileNameAr(i) For Input As #fileNum
            On Error GoTo 0
    
            'csvファイルを1行毎に読み込み
            Do Until EOF(fileNum)
                Line Input #fileNum, buf
                ar = Split(buf, ",")
                '区切り文字 , で切り出されて、ar(0)〜に値が入ってくる
    
                'この中で解析してtext2に結果を出力










            Loop
            Close #fileNum
'            Text2.Text = Text2.Text + FileNameAr(i) + vbCrLf
        End If
    Next i
Exit Sub
FileOpenErr:
    MsgBox CStr(i + 1) + " 行目のファイルが開けません" + vbCrLf + """" + FileNameAr(i) + """"
End Sub
Text1に複数のファイルをドラッグするとファイル名が表示されて一度に処理することができます。



▼ 実際に改造してログファイルを解析してみました
上の方の Text2.Text = Text2.Text + Dir(FileNameAr(i)) + vbCrLf の行では、
フルパスの含まれたファイル名から Dir 関数によりファイル名のみを取り出しています。
下の方の Text2.Text = Text2.Text + ",,,=SUM(C:C),=D:D*8,分,=E:E/60,時間,=E:E*2.214,円(1KW/H=20円)," + vbCrLf の行では、
解析結果の文字列を csv ファイルとして保存してエクセルで開くと関数により自動的に集計がされるようにしています。
Option Explicit

Private Sub Form_Load()
    Command1.Caption = "解析"
    Text1.Text = "ファイルをドラッグしてください"
    Text2.Text = "解析結果"
    'Text1にファイルをドラッグできるようにする
    Text1.OLEDropMode = vbOLEDropManual
End Sub

'ドラッグされたファイル名を表示する
Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Text1.Text = ""
    Dim i As Long
    For i = 1 To Data.Files.Count
        Text1.Text = Text1.Text + Data.Files(i) + vbCrLf
    Next i
End Sub

Private Sub Command1_Click()
    Dim i As Long
    Dim fileNum As Integer
    Dim buf As String
    Dim ar As Variant
    Dim FileNameAr As Variant
    
     Dim flag1, flag2, flag3, repetFlag As Integer
    flag1 = 0
    flag2 = 0
    flag3 = 0
    
    Text2.Text = ""
'    デザイン時にはドラッグが動かないためデバッグの為にファイルを直接指定する必要がある
'    Text1.Text = "C:\Users\test\Desktop\test.csv"
    FileNameAr = Split(Text1.Text + vbCrLf, vbCrLf)
    For i = LBound(FileNameAr) To UBound(FileNameAr)
        If FileNameAr(i) <> "" And FileNameAr(i) <> vbNull Then
            fileNum = FreeFile()
            On Error GoTo FileOpenErr
            Open FileNameAr(i) For Input As #fileNum
            On Error GoTo 0
    
            Text2.Text = Text2.Text + Dir(FileNameAr(i)) + vbCrLf
            'csvファイルを1行毎に読み込み
            Do Until EOF(fileNum)
                Line Input #fileNum, buf
                ar = Split(buf, ",")
                '区切り文字 , で切り出されて、ar(0)〜に値が入ってくる
    
                'この中で解析してtext2に結果を出力


                Dim H As Long
                H = CLng(Replace(ar(1), ":", ""))

                flag1 = CInt(ar(4)) '通常照明
                flag2 = CInt(ar(2)) 'ついたら非常モード 0:点灯 1:消灯
'                flag3 = 0  消灯時まで点灯していたら1
'                repetFlag = 0  繰り返しを消すためのフラグ
                
                'タイマーでの消灯直前まで点灯状態を取得する
                If H >= CLng("100000") And H <= CLng("100200") Then
                    flag3 = CInt(ar(4)) '通常照明
                ElseIf H >= CLng("150000") And H <= CLng("150200") Then
                    flag3 = CInt(ar(4)) '通常照明
                ElseIf H >= CLng("170000") And H <= CLng("170200") Then
                    flag3 = CInt(ar(4)) '通常照明
                End If
                
                If flag3 = 0 Then 'タイマーでの消灯直前まで点灯していた場合
                    If H >= CLng("100210") And H <= CLng("100950") Then '10時02分10秒から10時9分59秒
                        If repetFlag = 0 And flag2 = 0 Then
                            Text2.Text = Text2.Text + ar(1) + " 非常モード検出" + ",,0.66" + vbCrLf
                        ElseIf repetFlag = 0 And flag1 = 1 Then
                            Text2.Text = Text2.Text + ar(1) + ",,1" + vbCrLf
                        End If
                        repetFlag = 1
                    ElseIf H >= CLng("150210") And H <= CLng("150950") Then '15時02分10秒から15時9分50秒
                        If repetFlag = 0 And flag2 = 0 Then
                            Text2.Text = Text2.Text + ar(1) + " 非常モード検出" + ",,0.66" + vbCrLf
                        ElseIf repetFlag = 0 And flag1 = 1 Then
                            Text2.Text = Text2.Text + ar(1) + ",,1" + vbCrLf
                        End If
                        repetFlag = 1
                    ElseIf H >= CLng("170210") And H <= CLng("170950") Then '17時02分10秒から17時9分50秒
                        If repetFlag = 0 And flag2 = 0 Then
                            Text2.Text = Text2.Text + ar(1) + " 非常モード検出" + ",,0.66" + vbCrLf
                        ElseIf repetFlag = 0 And flag1 = 1 Then
                            Text2.Text = Text2.Text + ar(1) + ",,1" + vbCrLf
                        End If
                        repetFlag = 1
                    Else
                        repetFlag = 0
                    End If
                End If
            Loop
            Close #fileNum
'           Text2.Text = Text2.Text + FileNameAr(i) + vbCrLf
        End If
    Next i
    Text2.Text = Text2.Text + ",,,=SUM(C:C),=D:D*8,分,=E:E/60,時間,=E:E*2.214,円(1KW/H=20円)," + vbCrLf 
Exit Sub
FileOpenErr:
    MsgBox CStr(i + 1) + " 行目のファイルが開けません" + vbCrLf + """" + FileNameAr(i) + """"
End Sub



▲トップページ