けいじゅ@日本ラショナルソフトウェアです.

In [ruby-list :18233 ] the message: "[ruby-list:18233] [book]
blade.nagaokaut.ac.jp/ruby/ruby-list/ ", on Nov/01 14:07(JST)
Shin-ichiro Hara writes:

>原です。

>それから、122ページの csv_split ですが、
>
>def csv_split(source, delimiter = ',')
>  csv = []
>
>  qd = Regexp.quote(delimiter)
>  source.scan(/(([^"#{qd}]?[^#{qd}]*)|"(([^"]|"")*)"|)(#{qd}|$)/) do
>    |match, m1, m2, *rests|
>    if m2
>      csv.push m2.gsub(/""/, '"')
>    else
>      csv.push m1
>    end
>  end
>  csv
>end
>
>scan の正規表現内の最初の ? と、後ろから2番めの | は無い方がいい
>と思います。でもただ取ればいいのではないので難しいですね。

あ. ほんとだ... 色々やっているうちにエンバグしていたみたいです...

>def csv_split(source, delimiter = ',')
>  csv = []
>
>  qd = Regexp.quote(delimiter)
>  source.scan(/(([^"#{qd}][^#{qd}]*)|"(([^"]|"")*)")(#{qd}|$)|#{qd}/) do
>    |match, m1, m2, *rests|
>    if m2
>      csv.push m2.gsub(/""/, '"')
>    elsif m1
>      csv.push m1
>    else
>      csv.push ""
>    end
>  end
>  csv
>end
>
>でなんとかなると思うけどもっと良い直し方募集中。

これだと,

  foo,"bar",baz,

のように 最期に``,''で終わるとき問題ありです.


  source.scan(/(([^"#{qd}][^#{qd}]*|)|"(([^"]|"")*)")(#{qd}|$)/) do

これがいいかなと思いますが, いかがでしょう? 

# ほんとか?

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---