ボートレースデータを取得する その5

コンピューター

ボートレース公式サイトからデータを取得する

ボートレース公式では、各種データの公開が行われています。

https://boatrace.jp/

今回は、Visual Studio Communityを使い、C#で、指定した年月に該当する番組表、競走成績を取得します。検証等に時間がかかるので、分割して記事にしてあります。

2021年6月20日の時点では、ボートレース公式サイトのSSL化は行われていません。各種データも実質非標準となりつつあるlha形式を使用しています。コードを作成するにあたり、運営の方針変更等で構成の変更がある事も想定しておく事が必要です。

その3 正規表現を使って番組表をデータ化する

番組表


取り込むデータを構造体として定義します。

private struct BrtProgramBase
{
    public DateTime EventDate;
    public int EventDay;
    public int RaceTrackCode;
    public string RaceTrackName;
    public string EventTitle;
    public int RaceNumber;
    public string RaceTitle;
    public string RaceConstraints;
    public string RaceDistance;
    public DateTime VotingDeadline;
}

private struct BrtProgramPlayer
{
    public int CourseNumber;
    public int PlayerNumber;
    public string PlayerName;
    public int PlayerAge;
    public string PlayerBranch;
    public int PlayerWeight;
    public string PlayerClass;
    public float Nation1st;
    public float Nation2nd;
    public float Local1st;
    public float Local2nd;
    public int MotorNumber;
    public float Motor2nd;
    public int BoatNumber;
    public float Boat2nd;
    public string SeasonResults;
    public string RaceRelation;
}

番組表テキスト種類分け及び正規表現

番組表データを含む行のパターンを調べます。

STARTB ①
24BBGN ②
ボートレース大 村    7月 1日  アサヒビールカップ   第 1日 ③

                            *** 番組表 *** ④

          アサヒビールカップ                ⑤

   第 1日          2021年 7月 1日                  ボートレース大 村 ⑥

               -内容については主催者発行のものと照合して下さい- ⑦

 1R  予選     進入固定 H1800m  電話投票締切予定15:15 ⑧ 
------------------------------------------------------------------------------- ⑨
艇 選手 選手  年 支 体級    全国      当地     モーター   ボート   今節成績  早 ⑩
番 登番  名   齢 部 重別 勝率  2率  勝率  2率  NO  2率  NO  2率  123456見 ⑪
------------------------------------------------------------------------------- ⑫
1 3773津留浩一47長崎56B1 4.95 27.71 5.68 39.05 13  0.00 21  0.00              5 ⑬

24BEND ⑭
FINALB ⑮

① データ開始ラベル(データ項目なし)

② ボートレース場(24)の番組表(B)開始のラベル

anchor = @"^(?<RaceTrackCode>[0-9]{2})BBGN";

③ 開催情報(開催情報⑤及び➅から取得する為、取得しない)

④ 番組表タイトル(データ項目なし)

⑤ 開催タイトル

anchor = @"^\s{10}(?<EventTitle>[^\x01-\x7E]{25})";

➅ 開催情報

anchor = @"^\s{3}第(?<EventDay>[0-9\s]{2})日\s{10}(?<year>[0-9\s]{4})年(?<month>[0-9\s]{2})月" +
         @"(?<date>[0-9\s]{2})日\s{18}(?<RaceTrackName>[^\x01-\x7E]{9})";

⑦ コメント(データ項目無し)

⑧ レース情報

anchor = @"^(?<RaceNumber>[0-9\s]{2})R\s{2}(?<RaceTitle>[^\x01-\x7E]{6})\s(?<RaceConstraints>[^\x01-\x7E]{4}|\s{8})\s" +
         @"(?<RaceDistance>[A-Z0-9]{6})\s{2}電話投票締切予定(?<VotingDeadline>[0-9:]{5})";

⑨ 区切り線(データ項目無し)

⑩ レースタイトル(データ項目無し)

⑪ レースタイトル(データ項目無し)

⑫ 区切り線(データ項目無し)

⑬ 選手情報

anchor = @"^(?<CourseNumber>[1-6])\s(?<PlayerNumber>[0-9]{4})(?<PlayerName>[^\x01-\x7E]{4})(?<PlayerAge>[0-9]{2})" +
         @"(?<PlayerBranch>[^\x01-\x7E]{2})(?<PlayerWeight>[0-9]{2})(?<PlayerClass>[A-Z0-9]{2})\s(?<Nation1st>[0-9.\s]{4})\s" +
         @"(?<Nation2nd>[0-9.\s]{5})\s(?<Local1st>[0-9.\s]{4})\s(?<Local2nd>[0-9.\s]{5})\s(?<MotorNumber>[0-9\s]{2})\s" +
         @"(?<Motor2nd>[0-9.\s]{5})\s(?<BoatNumber>[0-9\s]{2})\s(?<Boat2nd>[0-9.\s]{5})\s(?<SeasonResults>[0-9\s]{12})" +
         @"(?<RaceRelation>[0-9\s]{2})";

⑭ ボートレース場(24)の番組表(B)終了のラベル(開始ラベル②から取得する為、取得しない)

⑮ データ終了ラベル(データ項目なし)

データ化した番組表出力する

本来ならデータベース化するべき内容と思われますが、今回は項目毎にダブルクォーテーションで囲んだCSVファイルでの出力とします。

1日毎の番組表(Byymmdd.txt)に対して、基本情報(Byymmdd_base.csv)と選手情報(Byymmdd_player.csv)として作成されます。尚、選手情報には基本情報とのリレーションの為、基本情報から開催日、日次、レース場コードを付加して出力します。

コメント

タイトルとURLをコピーしました