やらなきゃいけないこと
前回
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