わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

KanjiSorter更新(日付処理を中心に)

 引数の文字列に対して,または引数で指定されたファイルを読み出して,その入力に含まれている漢字を,小学校で学習する学年(および配当外)に振り分け,出現回数を出力するRubyスクリプト,kanji-sorter.rbを更新しました.3日ぶりのコミットになります.
 KanjiSorter更新では「KanjiYearモジュール」と書きましたが,このモジュールを廃止し,Dateクラスにメソッドを追加するよう,kanji-sorter.rbとテストスクリプト(test/test_kanji-sorter.rb)を書き換えました.
 どの学年別漢字配当表を使用するかについては,「公表年」または「使用日」を指定します.公表年については,前の記事にも書いたとおり,西暦年にすると2017,1989,1977,1958の4つです.いずれも公表日は1月1日ではありませんが,プログラムとしては(公表年指定の場合は)月日を無視しています.
 使用に関しては「年」だけでなく「月」も必要となります.というのも現在は2020年3月ですが,小学校に関しては,平成20年(2008年)告示,平成23年(2011年)施行の小学校学習指導要領に基づいており,この場合,学年別漢字配当表は,1989年公表のものと同一となります.来月からは,2017年告示の小学校学習指導要領で,学年別漢字配当表も最新のものになります*1
 年の指定は,ここまで書いてきた西暦年のほか,「R2」「H04」「S64」といった元号の頭文字(英字の大小どちらも可)を認めるようにしました.月日の省略に関して,"R2"と書いたら,令和2年の最初の日ということで"2020-01-01"に変換するのに対し,"R2sy"と書くことで,school year(学校年度)と見なして,令和2年度の最初の日の"2020-04-01"に置き換えます.
 何と書いたら何年何月何日になるかについては,test/test_kanji-sorter.rbのテストコードをご覧ください.

  # Date.ks_parseにさまざまな引数を入れてDateオブジェクトを生成する
  def test_ks_parse
    assert_equal(Date.new(2020, 5, 1), Date.ks_parse("2020-05-01"))
    assert_equal(Date.new(2020, 4, 1), Date.ks_parse("R2sy"))
    assert_equal(Date.new(2020, 3, 1), Date.ks_parse("R2-03"))
    assert_equal(Date.new(2020, 1, 1), Date.ks_parse("2020"))
    assert_equal(Date.new(2019, 4, 1), Date.ks_parse("R1 school year"))
    assert_equal(Date.new(1992, 4, 1), Date.ks_parse("H4 school year"))
    assert_equal(Date.new(1992, 3,31), Date.ks_parse("H04-03-31"))
    assert_equal(Date.new(1980, 4, 1), Date.ks_parse("S55sy"))
    assert_equal(Date.new(1989, 1, 1), Date.ks_parse("S64-01-01"))
    assert_equal(Date.new(1988,12,31), Date.ks_parse("S63-12-31"))
    assert_equal(Date.new(2019, 4,30), Date.ks_parse("H31-04-30"))
    assert_equal(Date.new(2019, 4,30), Date.ks_parse("R1-04-30"))
    assert_equal(Date.new(2019, 5, 1), Date.ks_parse("H31-5-1"))
    assert_equal(Date.new(2019, 5, 1), Date.ks_parse("R01-5-01"))
    assert_equal(Date.new(2020,12, 1), Date.ks_parse("202012"))
    assert_equal(Date.new(2020,12, 1), Date.ks_parse("20201201"))
    assert_equal(Date.new(2020,12, 1), Date.ks_parse("2020-12"))
    assert_equal(Date.new(2020, 1, 2), Date.ks_parse("2020-1-2"))
  end

 Dateは「require 'date'」とすることで利用可能になるクラスです(class Date).Date.ks_parseは,kanji-sorter.rbの中で定義したクラスメソッドです.もう一つ,クラスメソッドを定義していまして,ハッシュを入力にとり,学年別漢字配当表の発表年を返すDate.ks_yearです.
 元号の西暦変換と,年月日を含む文字列への変換は,Dateクラスのインスタントメソッドにしています.
 ところで,Rubyの和暦のライブラリには"wareki"があります.「元号は大化から全部サポート」「旧暦は445年からサポート」とのことです.

 gem install warekiとirbを実行して,令和にも対応済みなのを確認しました.
 ただ,自分のプログラムでは昭和以降があればいいのと,"R2-1-1"といった入力でも2020年1月1日(のDateオブジェクト)が得られるようにしたいので,このライブラリは採用しませんでした.

*1:とはいえ移行措置もあって,4月に6年生になるうえの子は,昨年度から,新潟の「潟」などの漢字を練習していました.