【问题标题】:Ruby/Rails: CSV column specific convertersRuby/Rails:CSV 列特定转换器
【发布时间】:2017-11-23 14:08:41
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby csv


    【解决方案1】:

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

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

    converters: [:integer, :date]
    

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

    如果你需要绕过这个限制,你可以提供一个 lambda 转换器,它接受 2 个参数,其中第二个参数是一个 CSV::FieldInfo,其中包含标题,也就是值所在的列,并且只将转换应用于特定列。

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      相关资源
      最近更新 更多