【付録2】VBAでCSVデータを時間単位でまとめる
以下のサンプルプログラムをExcelのマクロにコピー&ペーストして実行すると、Excelに直接読み込めない巨大なCSVデータを分、時、日、月ごとにまとめ、Excelシートに書き込めるようになる。
なお、ソースでは、ログのCSVデータを『放射線log.csv』というファイル名で保存し、Cドライブのルートに置いたものとして書いている。集計の単位の変更方法や、平均を求めた際の有効桁数を変更したい場合の改変方法などは、ソースのコメント部分に書いておいた。動作チェックは、Excel 2003とWindows Vista Home Premiumで行なった。それ以外の環境でも正しく動作するとは思うが、保証はできない。
' ストロベリー・リナックス製 USBガイガーカウンターのCSVデータを ' 分、時、日、月ごとにまとめ、Excelシートに書き込むマクロ ' ' Copyright (C) 2007 Fujiyama Tetsuhito Mailto:tetsu-f@techdoc.jp ' ASCII Corporation. Web ASCII Editinal Team ' Sub 放射線測定1分単位にまとめる() Dim Y As Long ' 値を書き込むセルの行 Dim Buf As String ' CSVデータ1行分の文字列 Dim Prm() As String ' CSVデータ分解用 0:日時 1:値 Dim FastLine As Integer ' CSV第1行目のフラグ Dim Ntime As String ' 現在注目中の日時 Dim Btime As String ' 直前の日時 Dim TotalValue As Long ' 注目中の日時の累計値 Dim Count As Long ' 注目中の日時のデータ数 FastLine = 1 Y = 1 ' A,B列の表示形式を設定 A:文字列 B:少数点以下第2位まで有効 ' 0.000_ とすれば、第3位まで有効となる。 Columns("A:A").NumberFormatLocal = "@" Columns("B:B").NumberFormatLocal = "0.00_ " ' 保存したCSVファイルのファイル名をフルパスで指定する Open "C:\放射線Log.csv" For Input As #1 Do While (Not EOF(1)) Line Input #1, Buf ' 保存されたCSVは、文字列が""で括られていないので ' 単純にカンマでパラメータを分解 Prm() = Split(Buf, ",", 2, vbTextCompare) ' 分ごとにまとめる場合は ,16 ' 時ごとにまとめる場合は ,13 ' 日ごとにまとめる場合は ,10 ' 月ごとにまとめる場合は ,7 を指定する ' ' ここでは分ごとにまとめている Ntime = Left(Prm(0), 16) If (Ntime <> Btime) And (FastLine = 0) Then ' 注目する日時に変更があった場合 ' アクティブシートに日時と平均値を書き込む Cells(Y, 1).Value = Btime Cells(Y, 2).Value = TotalValue / Count ' 注目する日時の変更と累計値のクリア ' 書き込むセルの行を1増やす Btime = Ntime TotalValue = 0 Count = 0 Y = Y + 1 End If ' 注目している日時内であった場合は累計 Count = Count + 1 TotalValue = TotalValue + CLng(Prm(1)) ' CSV第1行フラグをクリア ' 注目中の日時を強制的に第1行の日時とする If FastLine = 1 Then Btime = Ntime FastLine = 0 End If Loop ' 累計中だった値を書き出す If Count <> 0 Then Cells(Y, 1).Value = Ntime Cells(Y, 2).Value = TotalValue / Count End If Close #1 End Sub