けいじゅ@日本ラショナルソフトウェアです. 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 <<---