SlideShare a Scribd company logo
takot
 諸事情によりRuby                    1.8.[56] でやってます
                        /)
                     ///)
                  /,.=゙''"/
      /          i f ,.r='"-‐'つ____            Ruby1.9? こまけぇこたぁいいんだよ!!
    /          /        _,.-‐'~/⌒ ⌒\
        /     ,i       ,二ニ⊃( ●). (●)\
      /     ノ         il゙フ::::::⌒(__人__)⌒::::: \
          ,イ「ト、 ,!,!|             |r┬-|         |
         / iトヾヽ_/ィ"\                `ー'´      /
Rubyで和暦をよみとる
発端
   最初はスクレイピング
    して取ってくる「平成
    21年10月3日(土)」を
    parseしたかった
   URLに
    …/h211003.html みた
    いなのがあったので日
    和る
   これ(h211003)を取り
    出してDateオブジェク
    トに変換したい
   一般的にはDate.parse
    を使う
実際にやってみた
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
   だが……
ただし
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”なら行け
    る
これは勝つる!
どこで表記を調べてるか辿ってみた

            まずDate.rbを読んだ
            require „format‟ してる
            /lib/ruby/1.8/date/format.r
             bの中でいろんなパターン
             マッチングで涙ぐましい
             努力をしてる
            format.rb 読めばよくね?
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
   if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ')
if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in,
   ' ') ||
   str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in,
   ' ')
自作
   自分のスクリプト内で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
できた!
d = Date.parse("h211003")
p d.year # => 2009
p d.month
p d.mday
% ./test.rb
2009
10
3
Future work
 当初の平成21年10月3日(土) とか 2009
  年10月3日 に対応したい
 Date.parse_jis のやり方が分かったので
  案外何とかなるかも
まとめ
 オレオレ日付のparseが
  したかったら,
  Date._parse_jis (など)
  をoverrideしよう!
 慶長9年 => K9. みたい
  のもいける!

More Related Content

PDF
カーネル密度推定を用いた店舗情報の可視化
PDF
Siphone coffeemaker okayama-js-1
KEY
Emacs 使いが Vim を使ってみた(ちょっとだけGit)
PPTX
俺と JAWS-UG と CLI
PDF
オレオレPHPのつくり方
PDF
PCさえあればいい。
PDF
いい加減に作ったAndroidアプリを放流したった
PPTX
USP 友の会 LT 資料 20130413
カーネル密度推定を用いた店舗情報の可視化
Siphone coffeemaker okayama-js-1
Emacs 使いが Vim を使ってみた(ちょっとだけGit)
俺と JAWS-UG と CLI
オレオレPHPのつくり方
PCさえあればいい。
いい加減に作ったAndroidアプリを放流したった
USP 友の会 LT 資料 20130413

What's hot (11)

PDF
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
PPTX
部活でシェル芸がはやらない
PDF
Play frameworkをエヴァンジェる
PDF
柿と杮
PDF
Redis Intro Osc2010 Tokyo Spring
PDF
zsh とわたし
PDF
OCamlでJavaScriptが幸せ
PDF
シェル芸をドット絵にして思いを伝えよう!
PDF
Web技術勉強会 第37回
PDF
入門 超絶技巧プログラミング !
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
部活でシェル芸がはやらない
Play frameworkをエヴァンジェる
柿と杮
Redis Intro Osc2010 Tokyo Spring
zsh とわたし
OCamlでJavaScriptが幸せ
シェル芸をドット絵にして思いを伝えよう!
Web技術勉強会 第37回
入門 超絶技巧プログラミング !
Ad

Viewers also liked (6)

DOC
Ejercicio 56
PPT
La mision del colibri
PPTX
Tema 1. multiplicación y división
DOCX
La leyenda del colibrí
PPT
Divisiones entre 10
PPTX
Modenf.powerpoint
Ejercicio 56
La mision del colibri
Tema 1. multiplicación y división
La leyenda del colibrí
Divisiones entre 10
Modenf.powerpoint
Ad

Similar to Rubyで和暦をよみとる (6)

DOCX
Data munging
PDF
20131102 第7回シェル芸勉強会
PDF
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
PDF
モテる! Node.js でつくる twitter ボット制作
PDF
Title
PDF
ゲーム開発者のための C++11/C++14
Data munging
20131102 第7回シェル芸勉強会
Ruby を用いた超絶技巧プログラミング(夏のプログラミングシンポジウム 2012)
モテる! Node.js でつくる twitter ボット制作
Title
ゲーム開発者のための C++11/C++14

Rubyで和暦をよみとる

  • 2.  諸事情によりRuby 1.8.[56] でやってます  /) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ Ruby1.9? こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
  • 4. 発端  最初はスクレイピング して取ってくる「平成 21年10月3日(土)」を parseしたかった  URLに …/h211003.html みた いなのがあったので日 和る  これ(h211003)を取り 出してDateオブジェク トに変換したい  一般的にはDate.parse を使う
  • 5. 実際にやってみた 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  だが……
  • 6. ただし 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”なら行け る
  • 8. どこで表記を調べてるか辿ってみた  まずDate.rbを読んだ  require „format‟ してる  /lib/ruby/1.8/date/format.r bの中でいろんなパターン マッチングで涙ぐましい 努力をしてる  format.rb 読めばよくね?
  • 9. 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
  • 10. if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ')
  • 11. if str.sub!(/¥b([MTSH])(¥d+)¥.(¥d+)¥.(¥d+)/in, ' ') || str.sub!(/¥b([MTSH])(¥d{2})(¥d{2})(¥d{2})/in, ' ')
  • 12. 自作  自分のスクリプト内で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
  • 13. できた! d = Date.parse("h211003") p d.year # => 2009 p d.month p d.mday % ./test.rb 2009 10 3
  • 14. Future work  当初の平成21年10月3日(土) とか 2009 年10月3日 に対応したい  Date.parse_jis のやり方が分かったので 案外何とかなるかも
  • 15. まとめ  オレオレ日付のparseが したかったら, Date._parse_jis (など) をoverrideしよう!  慶長9年 => K9. みたい のもいける!