【问题标题】:Custom Ruby CSV converters for multiple fields用于多个字段的自定义 Ruby CSV 转换器
【发布时间】: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

【问题讨论】:

    标签: ruby csv fastercsv


    【解决方案1】:

    如果默认转换器不够用,这是正确的做法。我唯一的建议是将您的转换器分成不同的 lambda,因为 CSV 库已经设计为针对一组转换器测试每个字段(使您的 case 变得多余)。

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

    【讨论】:

      【解决方案2】:

      相应地转换字段字段名称(标题名称)

      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)
      

      【讨论】:

      • 如果你使用header_converters: :symbol,案例测试必须看起来像when :OrderUuid, :Exchange等等。
      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2014-09-27
      • 2018-05-13
      相关资源
      最近更新 更多