【HSP】2017年版 F1ランキングページを生成してみる【その11】

f1 ranking photo

ここからは今まで出力したものを利用してランキングなどを表示する仕組みを作っていきたいと思います。今回は全レース結果のCSVからドライバーポイントランキングを計算して出力するようにしてみたいと思います。

スポンサーリンク

CSVにどのようにデータを格納していたか確認してみる

項目をみてみると一番最初にドライバー名が入っており、後はGP名(順位)、ポイント、ラップ(タイム差)の繰り返しとなってます。今回使用するのはドライバー名とポイント部分なので、取り出したいデータの場所は

  • ドライバー名:1番目
  • ポイント:(3 × n – 1)番目 n=第n戦目のGP

となります。ただ、hspではデータの数を数える際、一番最初が「0」になるので実際の場所は

  • ドライバー名:0番目
  • ポイント:(3 × (n + 1) – 1 )= (3 × n + 2)番目 n=第n戦目のGPで0からスタートする

少し混乱するかもですが n=0、1、2、3 となっていくとポイントが格納されている場所が 2、5、8、11 と変化していくことになります。ちなみにレース数の割り出し方法は

notesel allresult_csv
noteget text_line, 0
split text_line, ",", buf
race_cnt = (stat - 1) / 3

split命令で分割できた数がstatに格納されるのを利用します。一番最初がドライバー名なので1を引いて3個ワンセットで1グランプリなので3で割って答えを出しています。splitの区切り文字はCSVファイルなので「,」になります。

ドライバー名を取り出す

まずはドライバー名を取り出します。これはそれぞれ一番最初(0番目)にあるデータなので

notesel allresult_csv
    (中略)
repeat notemax, 1
    noteget text_line, cnt
    split text_line, ",", csv_data
    driver_name(cnt) = csv_data(0)
loop

これでドライバー名が取り出せました。

割り出したレース数を使ってrepeat処理

次にレース数を割り出したのでそれを使って繰り返し(repeat)処理していきます。これはドライバー名を取り出す繰り返し処理の中に入れ子の形で挿入します。

    (略)
    driver_name(cnt) = csv_data(0)
        repeat race_cnt
        loop
loop

レース数に応じて取り出したいのはポイント部分なので

csv_data(3*cnt+2)

この形で取り出せます。ただし、csvのデータを「テキスト」として扱っているので、これを数字にしてあげる必要があります。ランキングにするためにはポイントの合計を数字の計算で出したいですからね。なので

int(csv_data(3*cnt+2))

となります。これを合計するので

sum_point += int(csv_data(3*cnt+2))

そして、ドライバー事にポイントをリセットしておく必要があり、合計したものはドライバー毎に格納してあげたいので以下のようにしました。

    (略)
    driver_name(cnt) = csv_data(0)
    sum_point = 0
        repeat race_cnt
            sum_point += int(csv_data(3*cnt+2))
        loop
    driver_point(cnt) = sum_point
loop

ここまでちゃんと出来ているかを確認してみます。driver_pointの後ろに

mes driver_name(cnt) + "\t:" + driver_point(cnt)

を追加して実行してみると

なんとなくあっているような感じですが、実際に昨年取得して出力していたhtmlと見比べてみると

HaryantoとVandoorneの部分がオカシイですね。Vandoorneで考察してみましょう。たしかピンチヒッターで一度参戦した以降はデータがない状態なので、レース数分の計算処理をする段階で何か関係ないデータを加算しているんじゃないかなと推測できます。Haryantoもどうようにデータが足りないドライバー。つまり、データが足りないドライバについては、そのフォローをする処理を考えておく必要がありそうです。

データが足りない場合の回避処理

今まではレース数を最初の項目数で割り出して全てのドライバーに適用していましたが、データが少ないドライバーも出現する可能性があることが判明したので、ドライバー毎にレース数を割り出す方法に変更しました。基本的な計算は変わらないので

split text_line, ",", buf
race_cnt = (stat - 1) / 3

この部分を消去し

repeat notemax, 1
    noteget text_line, cnt
    split text_line, ",", csv_data
    driver_name(cnt) = csv_data(0)

この後ろに

    race_cnt = (stat - 1) / 3

を追加してあげます。これによってドライバー毎にレース数が変わるようになるので、データが足りない場合でも計算違いは出てこないはずです。実行してみると

大丈夫そうですね! あと気になるのはドライバー名がない一番下の表示。これはドライバー名がなければ処理を回避するようにすればいいので

if csv_data(0) = "" : break

を繰り返し処理に追加してあげればOK

まとめ

今回はここまでとします。次回はポイント順にソートして、簡易的ではありますがhtml出力を予定しています。そしてできれば各レース結果とリンクを張ることにもチャレンジしてみたいと思います。今回も全コードを載せておきます~(今まで作成したファイルがないと動かないのでお気を付けくださいませ)。

    // into_pos
    home_pos = dir_cur
    html_pos = dir_cur + "\\html"
    csv_pos  = dir_cur + "\\csv"

    // folder_check
    dirlist chk, "*.*", 5
    if instr(chk, 0, "html") = -1 : mkdir "html"
    if instr(chk, 0, "csv") = -1 : mkdir "csv"

    // csv_check
    chdir home_pos
    dirlist chk, "Raceresulturl.csv"
    await 1
    if (stat = 0) {
        csv_text = "GP Name,URL\n"
    } else {
        notesel csv_text
        noteload "Raceresulturl.csv"
        noteunsel
    }
    chdir csv_pos
    dirlist chk, "allresult.csv"
    await 1
    if (stat = 0) {
        allresult_csv = "driver Name"
    } else {
        notesel allresult_csv
        noteload "allresult.csv"
        noteunsel
    }


    // 初期設定
    sdim driver_name,  40, 40
    dim driver_point,  40, 40


    //main
    notesel allresult_csv
    repeat notemax, 1
        noteget text_line, cnt
        split text_line, ",", csv_data
        if csv_data(0) = "" : break
        driver_name(cnt) = csv_data(0)
        race_cnt = (stat - 1) / 3
        sum_point = 0
            repeat race_cnt
                sum_point += int(csv_data(3*cnt+2))
            loop
        driver_point(cnt) = sum_point
        mes driver_name(cnt) + "\t:" + driver_point(cnt)
    loop

stop
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする