Rubyで和暦をよみとる

2,209 views

Published on

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

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,209
On SlideShare
0
From Embeds
0
Number of Embeds
65
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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. みたい のもいける!

×