给定一个逗号分隔的字符串和另一个指示类型的数组,如何构造一个不同类型的数组?
通过解析取自 的 CSV 输入stdin
,我有一个列标题数组Symbol
:
cols = [:IndexSymbol, :PriceStatus, :UpdateExchange, :Last]
和一行原始输入:
raw = "$JX.T.CA,Open,T,933.36T 11:10:00.000"
我想cells
从raw
输入构造一个数组,其中的每个元素cells
都是由cols
. 这样做的惯用 Ruby-sh 方法是什么?
我试过这个,它有效,但感觉不太对。
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(",")
cells
4)最后通过构造相应列标题所指示的类型来修改每个元素:
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(",")