加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用于多个字段的自定义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(布尔值)
>“False”(字符串) – > false(布尔值)
>“%m /%d /%Y”(字符串格式) – >日期对象
>“%m /%d /%Y%I:%M:%S%p”(字符串格式) – > DateTime对象

默认的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库已经设计为针对转换器阵列测试每个字段(使你的情况多余).

但如果这只是一个快速的一次性脚本,你所拥有的就足够了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读