用于多个字段的自定义Ruby CSV转换器
发布时间:2020-12-17 02:39:26 所属栏目:百科 来源:网络整理
导读:我正在导入一个CSV文件,其中包含需要转换的字段,如下所示: “True”(字符串) – true(布尔值) “False”(字符串) – false(布尔值) “%m /%d /%Y”(字符串格式) – 日期对象 “%m /%d /%Y%I:%M:%S%p”(字符串格式) – DateTime对象 默认的CSV转
我正在导入一个CSV文件,其中包含需要转换的字段,如下所示:
>“True”(字符串) – > true(布尔值) 默认的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} true,2012-03-12,2012-03-12T14:14:23 00:00 false,2011-01-25,2013-03-12T03:14:27 00:00 解决方法
如果默认转换器不足,这是正确的做法.我唯一的建议是将转换器分成不同的lambda,因为CSV库已经设计为针对转换器阵列测试每个字段(使你的情况多余).
但如果这只是一个快速的一次性脚本,你所拥有的就足够了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |