競馬データJVDataのレコードをSQL文に成形するまでのデータフロー

クラスモジュールの設計が終わって、コーディングをしていたら、データフローやパースのロジックが曖昧だったのに気づいて、そこを考えています。

JVLinkのJVGetsメソッドで取得する競馬データJVDataのレコードのデータ構造はByte型の1次元配列です。配列の1要素は1 Byteで、文字コードShift-JISのバイナリデータが代入されています。

Excel VBAでは次のようにJVGetsをコールすると、変数Record()に1レコード分のバイナリデータが代入されます。

  Dim Record() as Byte
  Dim JVDFileName as String
  Dim Ret as Long

  Ret = Sheet1.JVLink1.JVGets(Record, 102890, JVDFileName)

JVDataからSQLiteデータベースを構築するとは、Byte型の1次元配列を好みのテーブルに並び替えて、SQLのINSERT文かUPDATE文に成形して、データベースにクエリすることの繰り返しです。図にすると次のようになります。

データフロー

全部で約4000個のjvdファイル毎にレコードを蓄積する先がJVDataCollectionクラスのオブジェクトです。

蓄積したレコードをテーブルの形にしてTableCollectionクラスのオブジェクト(クラス内でDictionaryオブジェクトを使う)に代入します。1つのレコードから1つのテーブルの場合もあれば、1つのレコードから2つ以上のテーブルに分ける場合もあります。

作ったテーブルをSQL文に成形してTextSystemクラス(クラス内で文字列領域を確保したString型変数を使う)に代入します。

レコードのデータを分解して振り分けるテーブルをVBA内でどう実現しようかと考えていて、1つのクラスに1つのテーブルを対応させればわかりやすいのではないかと考えました。

例えば、JVDataにはRAレコードというレース情報をまとめたレコードがあります。レース開催日、レース名、出走頭数などのデータが入っています。他にもRAレコードは1着から5着までの賞金や、1ハロンから25ハロンまでのラップタイムなど、全部で1272 Bytesのデータが1次元配列になっています。

これをこのままデータベースのテーブルにするとテーブルの列数が多くなりすぎてしまいます。そこで、RAレコードを、レース賞金ラップタイムなど複数のテーブルに分けてデータベースに追加したいのです。

1つのクラスに1つのテーブルを対応させるとは、レーステーブルにはRaceクラスを用意して、Raceクラスがテーブルの作成やデータベースへの登録などを行うといった具合です。

レコードは全部で37種類あり、テーブルの数は50くらいになりそうです。50個のクラスを用意して、それぞれにテーブルを作成するMakeメソッドやデータベースに追加するToDatabaseメソッドなどを作ろうと考えています。

Kosuke Maeda / まえだこうすけ

「機械学習で競馬予想して勝てるのか?」をテーマに活動中! QiitaにはR、VBAなどのTipsを投稿しています。