SlideShare a Scribd company logo
1 of 15
Download to read offline
takot
 諸事情によりRuby                    1.8.[56] でやってます
                        /)
                     ///)
                  /,.=゙''"/
      /          i f ,.r='"-‐'つ____            Ruby1.9? こまけぇこたぁいいんだよ!!
    /          /        _,.-‐'~/⌒ ⌒\
        /     ,i       ,二ニ⊃( ●). (●)\
      /     ノ         il゙フ::::::⌒(__人__)⌒::::: \
          ,イ「ト、 ,!,!|             |r┬-|         |
         / iトヾヽ_/ィ"\                `ー'´      /
発端
   最初はスクレイピング
    して取ってくる「平成
    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

What's hot

30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasual
30days Albumの裏側〜監視・インフラCI事情〜 #monitoringcasualTakahiro Okumura
 
部活でシェル芸がはやらない
部活でシェル芸がはやらない部活でシェル芸がはやらない
部活でシェル芸がはやらないxztaityozx
 
Play frameworkをエヴァンジェる
Play frameworkをエヴァンジェるPlay frameworkをエヴァンジェる
Play frameworkをエヴァンジェるke-m kamekoopa
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 
OCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せOCamlでJavaScriptが幸せ
OCamlでJavaScriptが幸せSachirou Inoue
 
シェル芸をドット絵にして思いを伝えよう!
シェル芸をドット絵にして思いを伝えよう!シェル芸をドット絵にして思いを伝えよう!
シェル芸をドット絵にして思いを伝えよう!xztaityozx
 
Web技術勉強会 第37回
Web技術勉強会 第37回Web技術勉強会 第37回
Web技術勉強会 第37回龍一 田中
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !Nobutada Matsubara
 

What's hot (11)

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

Viewers also liked

Viewers also liked (6)

Ejercicio 56
Ejercicio 56Ejercicio 56
Ejercicio 56
 
La mision del colibri
La mision del colibriLa mision del colibri
La mision del colibri
 
Tema 1. multiplicación y división
Tema 1. multiplicación y divisiónTema 1. multiplicación y división
Tema 1. multiplicación y división
 
La leyenda del colibrí
La leyenda del colibríLa leyenda del colibrí
La leyenda del colibrí
 
Divisiones entre 10
Divisiones entre 10Divisiones entre 10
Divisiones entre 10
 
Modenf.powerpoint
Modenf.powerpointModenf.powerpoint
Modenf.powerpoint
 

Similar to Rubyで和暦をよみとる

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

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

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

Rubyで和暦をよみとる

  • 2.  諸事情によりRuby 1.8.[56] でやってます  /) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ Ruby1.9? こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
  • 3.
  • 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. みたい のもいける!