Pythonでタイプ数カウンターのデータ抽出

タイプ数カウンターっていうのが楽しくて2年前くらいから使っているんだけど、
日々ログが流れていってしまうのが残念なので、カウントデータを抽出してみた。
インストールしたtypectフォルダにある「data」の中身の形式が分からんくて諦めてたんだけど、
どうやらunpackモジュールというのを使えばいいらしかったので、それで地道に。
[1]のサイトをものすごく参考にさせていただいて、それでも不明のキーを一つずつチェックして、さらに
  トータル~今日~今週~昨日~先週
の順に並んでいるっぽいことを突き止めて、とかなり苦労した。
まだ不明のキー?があるけど自分のキーボードではカウントされていないキーなので知りようもなく、
とりあえず暫定版で。

参考
[1] タイプカウンタのあれ - Bulknews::Subtech - subtech
[2] バイナリデータの入力処理 - 強火で進め
[3] アルファベットのリストを作る in python - へたっぴpythonista


以下はとりあえず動くレベルの汚いソース。
同じディレクトリにタイプ数カウンターのdataファイルを置いて実行すると、test.tsvとしてカウントデータを出力。
csvじゃなくてtsvなのは趣味。

#! /usr/bin/python
# -*- coding: utf-8 -*-
#
# extracts counts from data in typect folder.
#

import sys, os
from struct import *

# 
# ---------- ---------- ---------- ---------- ----------
def extractCounts():
  sb = []
  br = open("data", "rb")
  hds = ((0, "TOTAL"), (12, "TODAY"), (12, "THISWEEK"), (12, "YESTERDAY"), (12, "LASTWEEK"))
  skip_keys = [
    (0, ("others",)),
    (7, ("BackSpace", "Tab")),
    (3, ("Enter",)),
    (2, ("Shift", "Ctrl", "Alt", "CapsLock", "Pause")),
    (6, ("Esc", "henkan",  "muhenkan")),
    (2, ("Space", "PageUp", "PageDown", "End", "Home", "Left", "Up", "Right", "Down")),
    (3, ("PrintScreen", "Insert", "Del",)),
    (1, [str(num) for num in range(10)]),
    (7, [chr(i) for i in range(65, 65+26)]),
    (0, ("winL", "winR")),
    (3, ["ten"+str(num) for num in range(10)]),
    (0, ("ten*", "ten+")),
    (1, ("ten-", "ten.", "ten/")),
    (0, ["F"+str(num) for num in range(1, 13)]),
    (20, ("NumLock", "ScrollLock")),
    (40, (":", ";", ",", "-", ".", "/", "@")),
    (26, ("[", "yen", "]", "^")),
    (3, ("\\",)),
    (15, ("katakana", "HanZen",))
    ]
  #
  hi = 0
  for hd in hds:
    sum = 0
    sb.extend(["# ========== ", hd[1], " ==========\n"])
    for i in range(hd[0]):
      sbAppend(sb, br)
    #
    if hi in (0, 1, 3):
      if hi in (0, 3):
        for key in ("n_dates", "YYYY", "MM", "DD"):
          sbAppend(sb, br, "("+key+")")
      #
      sbAppend(sb, br, "(sum)")
      for hh in range(24):
        sbAppend(sb, br, "H"+str(hh).zfill(2))
    #
    else:
      for key in ("?", "n_weeks"):
        sbAppend(sb, br, "("+key+")")
      if hi == 2:
        for key in ("SUNsum", "MONsum", "TUEsum", "WEDsum", "THUsum", "FRIsum", "SATsum"):
          sbAppend(sb, br, "("+key+")")
      else:
        sbAppend(sb, br, "(WEEKsum)")
      for key in ("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"):
        sbAppend(sb, br, "("+key+")")
    #
    for sk in skip_keys:
      for i in range(sk[0]):
        sbAppend(sb, br)
      for i in range(len(sk[1])):
        sum += sbAppend(sb, br, sk[1][i])
    print hd[1], sum
    hi += 1
  #
  for i in range(12):
    sbAppend(sb, br)
  #
  for key in ("YYYYmost", "MMmost", "DDmost", "SUMmost"):
    sbAppend(sb, br, "("+key+")")
  #
  br.close()
  #
  fw = open("test.tsv", "w")
  fw.write("".join(sb))
  fw.close()

# 
# ---------- ---------- ---------- ---------- ----------
def sbAppend(sb, br, key=""):
  cnt = unpack('
  sb.extend([key, "\t", str(cnt), "\n"])
  return cnt

# test
# ---------- ---------- ---------- ---------- ----------
if __name__ == "__main__":
  extractCounts()

日々ログを取っておきたいのであれば、これを実行するbatファイルを作って
タスクスケジューラに突っ込んでおけばおk。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)