Ruby / Rails:CSV列特定转换器

时间:2017-06-20 21:13:12

标签: ruby-on-rails ruby csv

我有一个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
  }
}

1 个答案:

答案 0 :(得分:0)

尽管CSV没有提供这样的界面,但它确实允许您指定要尝试的多个转换器。仅当值与该过滤器的预期格式匹配时,才应用每个过滤器。

因此,您可以在选项中同时指定两个转换器,并且只要列的值与整数或日期的格式匹配,CSV就会智能地应用它们。

converters: [:integer, :date]

这种方法的缺点是,它还将转换其他列中的日期和整数,而不是将它们保留为字符串。

如果您需要解决此限制,则可以提供一个带有2个参数的lambda转换器,其中第二个参数是一个CSV::FieldInfo,其中包含标头(即值所在的列)并应用转换仅限于特定列。