Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rubyで和暦をよみとる

2,335 views

Published on

Rubyで和暦を読み取るときに注意すべきポイントについて調べました.

Published in: Technology, Education
  • Be the first to comment

  • Be the first to like this

Rubyで和暦をよみとる

  1. 1. takot
  2. 2.  諸事情によりRuby 1.8.[56] でやってます  /) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ Ruby1.9? こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
  3. 3. 発端  最初はスクレイピング して取ってくる「平成 21年10月3日(土)」を parseしたかった  URLに …/h211003.html みた いなのがあったので日 和る  これ(h211003)を取り 出してDateオブジェク トに変換したい  一般的にはDate.parse を使う
  4. 4. 実際にやってみた irb(main):002:0> d = Date.parse("h211003")  #<Date: 3458007/2,0,2299161> irb(main):004:0> p d.year 21 => nil irb(main):005:0> p d.day 3  nil  irb(main):007:0> p d.month 10 => nil  年のが失敗する……orz  だが……
  5. 5. ただし irb(main):008:0> d = Date.parse("H21.10.03") => #<Date: 4910215/2,0,2299161> irb(main):009:0> p d.year 2009 => nil  “H21.10.03”なら行け る
  6. 6. これは勝つる!
  7. 7. どこで表記を調べてるか辿ってみた  まずDate.rbを読んだ  require „format‟ してる  /lib/ruby/1.8/date/format.r bの中でいろんなパターン マッチングで涙ぐましい 努力をしてる  format.rb 読めばよくね?
  8. 8. format.rb def self._parse_jis(str, e) # :nodoc: if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') era = { 'm'=>1867, 't'=>1911, 's'=>1925, 'h'=>1988 }[$1.downcase] e.year = $2.to_i + era e.mon = $3.to_i e.mday = $4.to_i true end end
  9. 9.  if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ')
  10. 10. if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') || str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in, ' ')
  11. 11. 自作  自分のスクリプト内でDate._parse_jis をoverride  format.rb を直接書き換えても良いが,副作用を減らす # to expand Japanese calendar parsing def Date._parse_jis(str, e) # :nodoc: if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') || str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in, ' ') era = { 'm'=>1867, 't'=>1911, 's'=>1925, 'h'=>1988 }[$1.downcase] # p era # => 1988 e.year = $2.to_i + era e.mon = $3.to_i e.mday = $4.to_i true end end
  12. 12. できた! d = Date.parse("h211003") p d.year # => 2009 p d.month p d.mday % ./test.rb 2009 10 3
  13. 13. Future work  当初の平成21年10月3日(土) とか 2009 年10月3日 に対応したい  Date.parse_jis のやり方が分かったので 案外何とかなるかも
  14. 14. まとめ  オレオレ日付のparseが したかったら, Date._parse_jis (など) をoverrideしよう!  慶長9年 => K9. みたい のもいける!

×