我有一个 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
,并仅将转换应用于特定列。