Ruby/Rails:CSV 列特定转换器

Bla*_*son 5 ruby csv ruby-on-rails

我有一个 CSV 并使用默认的 CSV 库希望将不同的转换器应用于不同的列

标题是:

units_at_warehouse(#integer),
  external_id(#string),
    released(#date),
      list_price_cents(#integer)
Run Code Online (Sandbox Code Playgroud)

我当前正在使用这些选项:

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
Run Code Online (Sandbox Code Playgroud)

是否可以传入转换器PER列?

就像是:

options = {
  headers: true, 
  header_converters: :symbol,
  converters: {
    units_at_warehouse: :numeric,
    list_price_cents: :numeric,
    released: :date
  }
}
Run Code Online (Sandbox Code Playgroud)

Edw*_*son 1

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

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

converters: [:integer, :date]
Run Code Online (Sandbox Code Playgroud)

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

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