Ruby/Rails: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

是否可以传入每列转换器

像这样:

options = {
  headers: true, 
  header_converters: :symbol,
  converters: {
    units_at_warehouse: :numeric,
    list_price_cents: :numeric,
    released: :date
  }
}

虽然 CSV 不提供这样的接口,但它确实允许您指定多个要尝试的转换器。仅当值与筛选器的预期格式匹配时,它才会应用每个筛选器。

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

converters: [:integer, :date]

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

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

最新更新