我有一个CSV,并且使用默认的CSV库希望将不同的转换器应用于不同的列
标题是:
units_at_warehouse(#integer),
external_id(#string),
released(#date),
list_price_cents(#integer)
我目前正在使用这些选项:
options = {
headers: true,
converters: nil,
header_converters: :symbol
}
CSV.foreach(file, options) do |row|
# current my best option is:
convert_integers(row)
convert_dates(row)
persist(row)#...saving
end
是否可以传入转换器 PER 列?
类似的东西:
options = {
headers: true,
header_converters: :symbol,
converters: {
units_at_warehouse: :numeric,
list_price_cents: :numeric,
released: :date
}
}
答案 0 :(得分:0)
尽管CSV没有提供这样的界面,但它确实允许您指定要尝试的多个转换器。仅当值与该过滤器的预期格式匹配时,才应用每个过滤器。
因此,您可以在选项中同时指定两个转换器,并且只要列的值与整数或日期的格式匹配,CSV就会智能地应用它们。
converters: [:integer, :date]
这种方法的缺点是,它还将转换其他列中的日期和整数,而不是将它们保留为字符串。
如果您需要解决此限制,则可以提供一个带有2个参数的lambda转换器,其中第二个参数是一个CSV::FieldInfo
,其中包含标头(即值所在的列)并应用转换仅限于特定列。