0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C# .NetCoreで、ボートレース結果の解析 読み込みその2

Last updated at Posted at 2020-10-31

やらなきゃいけないこと

前回
C# .NetCoreで、ボートレース結果の解析 構造検討
https://qiita.com/TamanegiTarao/items/04f43d96e50cb3eeaa03
で内容が取り出せるようになった。
しかしながら、細かいバグさらいが必要だった。
その話。

レース結果がない場合

レース結果がない場合は以下のような場合がある。

例:K191014.TXT
02KBGN


ボートレース戸 田
データは、この場の全レース終了後に登録されます。


02KEND ←本来はここで開催日情報が来る行数

開催日情報が来る行は、文字列のパターンで拾うことがむつかしいところであるため、
現状XXKBGN 検知からの行数で把握していた。
またXXKENDの検知をしていなかった。

この2点を対応するようにコードを修正し解決。

7行目(開催日情報が記載されているか)

private static bool IsStringInDate(string str){ return Regex.IsMatch(str, "..../../.."); }

private static bool IsStringInInDay(string str){ return Regex.IsMatch(str, "第..日"); }

private bool IsStringLine7(string str){ return IsStringInDate(str) && IsStringInInDay(str); }

Regex.IsMatch(string target, string pattern)でパータン検知することで、
適切な行であるか検知できるようにした。
.で1文字ワイルドカードである。こういう場合は便利。
https://www.atmarkit.co.jp/ait/articles/1701/25/news025.html

XXKENDの検知、XXKBGNで開始、XXKBGNで終了を徹底。

if (line.Contains("KBGN"))
{   // 1.開催場コードの取得
    place = Lib.IntParse(line.Replace("KBGN", ""));
    inLineInfo = 0;
    start = true;
}
else if(line.Contains("KEND"))
{
    inLineInfo = 0;
    start = false;
}
else if(start)
{
    if (inLineInfo == 5) // 文字列を含むかどうかで拾うのがむつかしい
    {  
    	/* 略 */
    }
    else if (inLineInfo == 7)// 文字列を含むかどうかで拾うのがむつかしい
    {   // 3.節間日、開催年月日の取得
        if (IsStringLine7(line))
        {
            raceBase.Place = place;
            raceBase.InDay = Lib.IntParse(_StringExtraction(line, 5, 2));

            DateTime dateTime = new DateTime(Lib.IntParse(_StringExtraction(line, 19, 4)),
                                                Lib.IntParse(_StringExtraction(line, 24, 2)),
                                                Lib.IntParse(_StringExtraction(line, 27, 2)));
            raceBase.Date = dateTime;
            if (entryfirst)
                internodeTitle.Start = dateTime;
            internodeTitle.End = dateTime;
        }
        else
        {
            Console.WriteLine("Error:" + line + " " + raceBase.Date.ToString("yyyyMMdd"));
        }

    }
    /* 略 */
}

2周時の配慮不足

通常ボートレースはコースを3周するが、荒天により2周になる場合がある。

   1R       予 選                    H1800m  晴   風  北   2m  波   3cm
  10R       予選特賞                   H1200m  雨   風  北   2m  波   3cm

従来はH1800mで拾っていたがこれでは、2周時に拾うことができないので、

private bool IsStringInRoundInfo(string str) { return Regex.IsMatch(str, "H1.00m"); }

で拾うように変更した。
単純なバグですね。。。

まとめ

これにより、1年分のデータを取得してみたが取れている様子である。
必要だったら修正しなければならないが、いったんは読み取りはできるようになったと判断。

今後は、展示情報のスクレイピングしていきたい。

次回
C# .NetCoreで、ボートレース結果の解析 スタ展スクレイピング
https://qiita.com/TamanegiTarao/items/0d7d4a1e0452c866c2fd

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?