假设您有以下文件:
textfield,datetimefield,numfield
foo,2008-07-01 17:50:55.004688,1
bar,2008-07-02 17:50:55.004688,2
读取 .csv 的 Ruby 代码类似于:
#!/usr/bin/env ruby
require 'csv'
csv = CSV($stdin, :headers => true, :converters => :all)
csv.each do |row|
print "#{row}"
the_date = row['datetimefield'].to_date
end
该代码给出了这个错误信息:
./foo2.rb:8:in `block in <main>': undefined method `to_date' for "2008-07-01 17:50:55.004688":String (NoMethodError)
什么给了?
我读过 the docs , 但我不明白。
编辑:是的,我可以单独解析字段。这个问题的重点是我想学习如何使用记录的转换器功能。
最佳答案
你问的是如何使用转换器。
我的例子定义了一个新转换器 mytime
的用法。
如果可能,转换器 my_time 会尝试构建一个时间对象。
#Define test data
src = <<csv
textfield,datetimefield,numfield
foo,2008-07-01 17:50:55.004688,1
bar,2008-07-02 17:50:55.004688,2
csv
require 'csv'
require 'time'
CSV::Converters[:mytime] = lambda{|s|
begin
Time.parse(s)
rescue ArgumentError
s
end
}
csv = CSV(src, :headers => true, :converters => [:mytime])
csv.each do |row|
print "#{row}"
the_date = row['datetimefield'].to_date
end
使用这种技术,您还可以定义一个转换器来从类似时间的字符串创建日期。此解决方案还保留所有其他转换器。
#define test data
src = <<csv
textfield,datetimefield,numfield
foo,2008-07-01 17:50:55.004688,1
bar,2008-07-02 17:50:55.004688,2
csv
require 'csv'
require 'time'
CSV::Converters[:time2date] = lambda{|s|
begin
Time.parse(s).to_date
rescue ArgumentError
s
end
}
csv = CSV(src, :headers => true, :converters => CSV::Converters.keys + [:time2date])
csv.each do |row|
print "#{row}"
p row['datetimefield'] #Date-field
end
关于ruby - 你如何使用 Ruby CSV 转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903649/