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)
尽管 CSV 不提供这样的接口,但它确实允许您指定多个转换器来尝试。仅当值与过滤器的预期格式匹配时,它才应用每个过滤器。
因此,您可以在选项中指定这两个转换器,只要列的值与整数或日期的格式匹配,CSV 就会智能地应用它们。
converters: [:integer, :date]
Run Code Online (Sandbox Code Playgroud)
他们的方法的缺点是它还会转换其他列中的日期和整数,而不是将它们保留为字符串。
如果您需要解决此限制,您可以提供一个带有 2 个参数的 lambda 转换器,其中第二个参数是CSV::FieldInfo包含标题(即值所在的列)的 ,并且仅将转换应用于特定列。
| 归档时间: |
|
| 查看次数: |
629 次 |
| 最近记录: |