器用貧乏です。はげたかです。日記です。

どうも、はげたかです。今まで器用貧乏に生きてきました。ジェネラリスト・フルスタックエンジニアを目指しています。

今日の一言:カテゴリ分けをしっかりしたらPVあがるかな?

学内の成績一覧からGPAを算出するコードを作成しました。

はじめに

学内の成績表に、S科目いくつ、A科目いくつ、B...というまとめがなく、最終GPAもなかったので、HTMLソースから、科目数、合計科目数、GPA毎の科目数等を算出し、最終GPAを出すコードを暇だから作成した。

※ このコードは、私が所属する大学でしか使えない。

環境

  • ruby
  • 成績表一覧のHTMLソースがあること(今回は、seiseki.txtとする)

HTMLソースの例は以下の通り。

 <span class="bold"><既修得科目></span>
    <table class="table">
        <tbody><tr>
            <th width="95" align="center" height="32" class="th">
                科目コード
            </th>
            <th width="375" align="center" height="32" class="th">
                科目名
            </th>
            <th width="40" align="center" height="32" class="th">
                必選
            </th>
            <th width="74" align="center" height="32" class="th">
                取得年月
            </th>
            <th width="63" align="center" height="32" class="th">
                単位
            </th>
            <th width="63" align="center" height="32" class="th">
                評価
            </th>
        </tr>
  <tr>
    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2"></font></td>    <td class="td" height="33" align="left" bgcolor="#ffffff"><font size="2">&nbsp;Unified&nbsp;English&nbsp;Ⅰ</font></td>    <td class="td" height="33" align="left" bgcolor="#ffffff"><font size="2">&nbsp;必修</font></td>    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2">2012/8</font></td>    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2">2</font></td>    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2">S</font></td>  </tr>
  <tr>
    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2"></font></td>    <td class="td" height="33" align="left" bgcolor="#ffffff"><font size="2">&nbsp;Unified&nbsp;English&nbsp;Ⅱ</font></td>    <td class="td" height="33" align="left" bgcolor="#ffffff"><font size="2">&nbsp;必修</font></td>    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2">2013/2</font></td>    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2">2</font></td>    <td class="td" height="33" align="center" bgcolor="#ffffff"><font size="2">S</font></td>  </tr>

....

コード

#encoding: utf-8

def calc_gpa(count)
    weight = 5
    sum_result = 0
    sum_mount = 0
    count.each do |c|
        sum_mount += c
        sum_result += c * weight
                weight -= 1
    end
    puts "sum_result: #{sum_result}"
    puts "sum_mount: #{sum_mount}"
    puts "end_gpa: #{sum_result.to_f / sum_mount.to_f}"
end

count = [0, 0, 0, 0, 0, 0]
line = fields = 0
open("seiseki.txt") { |file|
    while line = file.gets
#今学期の成績  if line =~ /2015\/2/

            if line =~ />S</
                count[0] += 1
            elsif line =~ />A</
                count[1] += 1
            elsif line =~ />B</
                count[2] += 1
            elsif line =~ />C</
                count[3] += 1
            end
#今学期の成績  end
         end
}
puts count
puts '*** ' * 5
calc_gpa(count)

もう少し良くするために

  • コンソールで読み込むファイルを指定するようにする

$ ruby get_gpa.rb seiseki.txt

コマンドの引数の定数?変数?はわからないけど、調べれば簡単に出るよね。 ARGV[]とかそんな感じで

今回は横着して、

/>S</

に挟まれている、Sをマッチさせるようにした。もう少し綺麗な、正規表現を使いたいところ。正規表現を少し触ってみて、正規表現の可能性がすごく広いことを知った。前からだけど...

  • もう少しrubyっぽいコードを書きたい

基礎を少しだけ飛ばして、Railsに入ったので、Rubyの凄さがまだわからない。Ruby オンリーの書籍を読むことで、Ruby の可能性を知りたい。

Rubyによるクローラー開発技法  巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法  巡回・解析機能の実装と21の運用例

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

図書館にリクエストするぞ!

  • 別の言語でもこれらのコードを書いてみる。

さいごに

ちょっとした時間に作って、今急ぎで記事を書いているので、コードの修正などをしていない。(汚いまま載せた。)

そこのところご了承下さい。

と言うか基本的に自分が作るのは学校に関係するシステムなので、完全なコードを載せることができない。

時間割のシステムや図書館のリクエストシステム、今回のコードなど、、、

学校の役に立ちたい、というよりは自分が楽したいって気持ちが強いからかなぁ。別のこともやりたい!