グラフ化しようとしています。
まずは以下のようにアクセスログを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
.
.
.
もともと 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
が生成されます。
ご連絡が遅くなりすみません。
別の仕事が立て込んでしまって、
頂いたスクリプトをまだ試せていません。
質問の終了期限なのでいったんクローズして、
ポイント送付させていただきます。
迅速にご回答いただいて、とても感謝しています。