【发布时间】:2013-10-16 07:57:52
【问题描述】:
我正在导入一个 CSV 文件,其中包含需要转换的字段,如下所示:
- “真”(字符串)->真(布尔)
- “假”(字符串)->假(布尔)
- “%m/%d/%Y”(字符串格式)-> 日期对象
- “%m/%d/%Y %I:%M:%S %p”(字符串格式)-> DateTime 对象
默认 CSV 转换器与日期和日期时间字段不匹配。下面这个方法似乎可行,但想知道是否有更好的方法,可能通过覆盖转换器使用的匹配模式?
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}
真的,2012-03-12,2012-03-12T14:14:23+00:00
假,2011-01-25,2013-03-12T03:14:27+00:00
【问题讨论】: