コンマ区切りの文字列と型を指定する別の配列を指定して、異なる型の配列を作成するにはどうすればよいですか?
から取得した CSV 入力を解析することによりstdin
、列ヘッダーSymbol
の配列が得られます。
cols = [:IndexSymbol, :PriceStatus, :UpdateExchange, :Last]
そして生の入力の行:
raw = "$JX.T.CA,Open,T,933.36T 11:10:00.000"
の各要素がの対応する要素によって識別される型であるcells
、入力から配列を作成したいと思います。これを行う慣用的なRuby-shの方法は何ですか?raw
cells
cols
私はこれを試しましたが、うまくいきますが、実際には正しくありません。
1) まず、カプセル化する必要がある各タイプのクラスを定義します。
class Sku
attr_accessor :mRoot, :mExch,, :mCountry
def initialize(root, exch, country)
@mRoot = root
@mExch = exch
@mCountry = country
end
end
class Price
attr_accessor :mPrice, :mExchange, :mTime
def initialize(price, exchange, time)
@mPrice = price
@mExchange = exchange
@mTime = time
end
end
2) 次に、変換する必要がある一意の列タイプごとに変換関数を定義します。
def to_sku(raw)
raw.match('(\w+)\.(\w{0,1})\.(\w{,2})') { |m| Sku.new(m[1], m[2], m[3])}
end
def to_price(raw)
end
3) 入力から文字列の配列を作成します。
cells = raw.split(",")
4) 最後にcells
、対応する列ヘッダーによって指定された型を構築することにより、インプレースの各要素を変更します。
cells.each_index do |i|
cells[i] = case cols[i]
when :IndexSymbol
to_sku(cells[i])
when :PriceStatus
cells[i].split(";").collect {|st| st.to_sym}
when :UpdateExchange
cells[i]
when :Last
cells[i].match('(\d*\.*\d*)(\w?) (\d{1,2}:\d{2}:\d{2}\.\d{3})') { |m| Price.new(m[1], m[2], m[3])}
else
puts "Unhandled column type (#{cols[i]}) from input string: \n#{cols}\n#{raw}"
exit -1
end
end
正しくないと感じる部分はステップ 3 と 4 です。これをより Ruby 風にするにはどうすればよいでしょうか? 私は、私の想像の中にのみ存在する、このようなある種の超簡潔な方法を想像していました:
cells = raw.split_using_convertor(",")