2013-10-09 55 views
1

我導入包含需要如下轉換領域的CSV文件:定製紅寶石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

回答

1

如果默認轉換器不夠用,這是正確的做法。我唯一的建議是將你的轉換器分成不同的lambda表達式,因爲CSV庫已經被設計用來測試每​​個字段對轉換器陣列(使你的case冗餘)。

但是,如果這只是一個快速的一次性腳本,你擁有的就足夠了。