reg*_*lus 5 ruby csv fastercsv
我正在导入一个CSV文件,其中包含需要转换的字段,如下所示:
默认的CSV转换器与Date和DateTime字段不匹配。下面的这种方法似乎可行,但是想知道是否有更好的方法,可能是通过覆盖转换器使用的匹配模式?
require 'csv'
require 'date'
src = <<csv
active,date_created,date_modified
"True","03/12/2012","03/12/2012 2:14:23 PM"
"False","01/25/2011","03/12/2013 3:14:27 AM"
csv
CSV::Converters[:my_converters] = lambda{|field|
begin
case field.to_s
when "True"
true
when "False"
false
when /^\d{2}\/\d{2}\/\d{4}$/
Date.strptime(field,"%m/%d/%Y")
else
DateTime.strptime(field,"%m/%d/%Y %I:%M:%S %p")
end
rescue ArgumentError
field
end
}
csv = CSV(src, :headers => true, :converters => [:my_converters])
csv.each{|row| puts row}
Run Code Online (Sandbox Code Playgroud)
真实,2012-03-12,2012-03-12T14:14:23 + 00:00
假,2011-01-25,2013-03-12T03:14:27 + 00:00
相应地将字段转换为字段名称(标题名称)
custom_converter = lambda { |value, field_info|
case field_info.header
when 'OrderUuid', 'Exchange', 'Type', 'OrderType'
value.to_s
when 'Quantity', 'Limit', 'CommissionPaid', 'Price'
value.to_f
when 'Opened', 'Closed'
Time.zone.parse(value)
else
fail("Unknown field name #{field_info.inspect}=#{value}")
end
}
CSV.parse(content, headers: :first_row, converters: [custom_converter]).map(&:to_h)
Run Code Online (Sandbox Code Playgroud)
如果默认转换器不够用,这是正确的处理方式。我唯一的建议是将您的转换器分成不同的 lambda,因为 CSV 库已经设计为针对一组转换器测试每个字段(使您的case变得多余)。
但是,如果这只是一个快速的一次性脚本,那么您所拥有的就足够了。
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |