Log Parserを使ってサーバのアクセスログを

グラフ化しようとしています。
まずは以下のようにアクセスログをCSVに変換するスクリプトを作成しました。

--count.txt
SELECT TO_STRING(DateTime, 'yyyy/MM/dd') AS Date,
TO_STRING(DateTime, 'hh:mm:ss') AS Time,
COUNT(*) AS Hits
INTO access_log.csv
FROM access_log
GROUP BY Date, Time
ORDER BY Date ASC

--count.bat
SET LPPath=%ProgramFiles%\Log Parser 2.2
"%LPPath%\LogParser.exe" file:count.txt -i:NCSA -o:CSV


しかしながら上記のスクリプトでは、
アクセスがない時間帯があると、
以下のように時間の間隔があいて集計されてしまいます。

Date,Time,Hits
2007/02/01,09:00:11,1
2007/02/01,09:00:15,3
2007/02/01,09:01:22,1


これを以下のようにアクセスがない時間には、
「0」が入るように集計したいです。
方法をご存知の方がいらっしゃいましたらご教示ください。

Date,Time,Hits
2007/02/01,09:00:11,1
2007/02/01,09:00:12,0
2007/02/01,09:00:13,0
2007/02/01,09:00:14,0
2007/02/01,09:00:15,3
2007/02/01,09:01:16,0
.
.
.

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/03/04 19:04:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント100pt

もともと SQL はあるデータを検索、集計するものなので、ないデータを表示させるのは難しいと思います。

そのような処理を回避する方法を検討されたほうが良い気もしますが、とりあえず目的を達成するための一案です。


SQL では対応が難しそうなので、後処理にしました。

まずcount.bat ファイルを下記のように変更します。

SET LPPath=%ProgramFiles%\Log Parser 2.2
"%LPPath%\LogParser.exe" file:count.txt -i:NCSA -o:CSV
CScript //nologo //B impCSV.vbs

バッチ、ログファイルがあるフォルダに impCSV.vbs を作成し、赤字部分を適切なパスに変更してください。

Option Explicit
'---------------------------------------------------------------------
    Const ForReading = 1, ForWriting = 2, ForAppending = 8 '// ファイル制御モード
'---------------------------------------------------------------------
    Const csvFile = "C:\Data\accesslog.csv"      '// 元CSV ファイル
    Const impFile = "C:\Data\accesslogImp.csv"   '// 0 補完 CSV ファイル

'---------------------------------------------------------------------
fileConvert CreateObject("Scripting.FileSystemObject"), csvFile, impFile

'---------------------------------------------------------------------
Sub fileConvert( fso, srcFilePath, dstFilePath )
'---------------------------------------------------------------------
    Dim srcFile
    Set srcFile = fso.OpenTextFile( srcFilePath, ForReading )

    Dim impFile
    Set impFile = fso.CreateTextFile( dstFilePath, True ) '// 出力ファイルがあったら上書き

    Dim stLine
    stLine = srcFile.ReadLine
    impFile.WriteLine stLine  '// 先頭行を出力

    Dim edLine
    Do While srcFile.AtEndOfLine <> True
        edLine = srcFile.ReadLine
        imputationZero impFile, stLine, edLine
        impFile.WriteLine edLine
        stLine = edLine
    Loop
End Sub
'---------------------------------------------------------------------
Sub imputationZero( dstFile, stLine, edLine )
'// stLine  と edLine の間を補完
'---------------------------------------------------------------------
    Dim workArray
    workArray = Split( stLine, "," )

    Dim stTime
    stTime = workArray(0) & " " & workArray(1)

    workArray = Split( edLine, "," )
    Dim edTime
    edTime = workArray(0) & " " & workArray(1)

    stTime = DateAdd( "s", 1, stTime )  '// 1秒加算

    Do While DateDiff( "s", edTime, stTime ) < 0 '// edTime になるまで
        lineAdd dstFile, stTime
        stTime = DateAdd( "s", 1, stTime ) '// 1秒加算
    Loop
End Sub

'---------------------------------------------------------------------
Sub lineAdd( dstFile, dstTime )
'// "YYYY/MM/DD,HH:MM:SS,0" を出力
'---------------------------------------------------------------------
    dstFile.WriteLine Year(dstTime) & "/" & Right( "0" & Month(dstTime), 2 ) & "/" & Right( "0" & Day(dstTime) ,2 ) & "," _
        & Right( "0" & Hour(dstTime), 2 ) & ":" & Right( "0" & Minute(dstTime), 2 ) & ":" & Right( "0" & Second(dstTime), 2 ) _
        & ",0"
End Sub

これで、バッチ実行後に accesslog.csv

2007/02/01,09:00:11,1

2007/02/01,09:00:15,3

2007/02/01,09:00:22,1

から accesslogImp.csv

2007/02/01,09:00:11,1

2007/02/01,09:00:12,0

2007/02/01,09:00:13,0

2007/02/01,09:00:14,0

2007/02/01,09:00:15,3

2007/02/01,09:00:16,0

2007/02/01,09:00:17,0

2007/02/01,09:00:18,0

2007/02/01,09:00:19,0

2007/02/01,09:00:20,0

2007/02/01,09:00:21,0

2007/02/01,09:00:22,1

が生成されます。

id:itomune

ご連絡が遅くなりすみません。

別の仕事が立て込んでしまって、

頂いたスクリプトをまだ試せていません。

質問の終了期限なのでいったんクローズして、

ポイント送付させていただきます。

迅速にご回答いただいて、とても感謝しています。

2007/03/04 19:03:45
  • id:Mook
    すいません。
    見直して気が付いたのですが、先頭行がタイトル行になっているので対応が必要です。

    タイトル行を出力するためには、vbs ファイル中の
    stLine = srcFile.ReadLine
    impFile.WriteLine stLine '// 先頭行を出力
    の部分を
    impFile.WriteLine srcFile.ReadLine '// タイトル行を出力
    stLine = srcFile.ReadLine
    impFile.WriteLine stLine '// 先頭行を出力
    のように、修正してください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません