人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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
.
.
.


●質問者: itomune
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:00 AS ASC CSV DD
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Mook
●100ポイント ベストアンサー

もともと 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

が生成されます。

◎質問者からの返答

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ