高橋です。

Kenji Hiranabe <hiranabe / esm.co.jp>さん:
> One-Liner の秀逸な例ではないでしょうか.

でも、

> $_.chomp.split(/,/).join('</TD><TD>')

って、

< $_.chomp.gsub(/,/,'</TD><TD>')

と変わりないんですよね。じつは(^^;

もちろん、「,」がセパレータとしてではなく、データ中の要素になっている
場合もあるので、gsubだけではまずいです。言うまでもなく、最初の例も。

というわけで、string#csv_split を書きました。こっちはコンテストに
ノミネートしたいですんですけど、メソッドだけじゃだめですか?

#でも、CSVの標準的な扱いってよく知らなかったりするのですが。

これを使えば、上の例は、

$_.chomp.csv_split.join('</TD><TD>')

でいけるはずです。

> # 上記中 chomp は,chop! の typo ですよね?

#{ }が返す値は、$_自体ではなく、$_をいじった値なので、「!」は
いらないはず。私の ruby 1.1b5 ではちゃんと動きます。

#1.1b5なので empty? が使えなかったりする……。

>   #{ ... } ってこうやって使うのですね.

私は、青山さんの書いた
「私はこれで Perl から乗り換えました。」
http://www.netlab.co.jp/ruby/jp/rensai/v0004.html

で学習しました。たいへん勉強になりました(_o_)>青山さん


高橋征義 (株式会社アイナック)              Email:maki / inac.co.jp

#!/usr/local/bin/ruby # # string::csv_split # # 概要:CSVとして解釈できる文字列を、配列に変換します。 # 変換できない場合はエラーになります。 # # ex. v1 = '"a","b""c",d'.csv_split # -> v1 = ['a','b"c','d'] # class String def csv_split(delimiter = ',') csv = [] data = "" self.chomp.split(/#{delimiter}/).each{|d| # data += (if data.empty? then ',' else '' end) + d if data.length == 0 data += d else data += delimiter+d end if data =~ /^"/ if data =~ /[^"]"$/ or data == '""' csv << data.sub(/^"(.*)"$/,'\1').sub(/""/,'"') data = '' end else csv << d data = '' end } # if data.empty? then csv else raise("cannot decode CSV\n") end if data.length == 0 csv else raise("cannot decode CSV\n") end end end ##### csv decode test ##### # # test_str = 'hogehoge,"hoge,ho""ge",hoge,",hoge,","hoge"' # print test_str.csv_split(",").join('|'),"\n" # # test_str = 'hgoeho,"hoge","","hogehoge"' # print test_str.csv_split(",").join('|'),"\n" # # test_str = 'hoge,"hoge,hoge' # error!! # print test_str.csv_split(",").join('|'),"\n"