ruby - 你如何使用 Ruby CSV 转换器?

标签 ruby csv

假设您有以下文件:

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/

相关文章:

ruby - 更新对分数没有影响(预测 API)

ruby - 为什么我不能让 swig wrap std::vector 到 Ruby 类?

linux - 如何在 bash 中对逗号分隔值进行排序?

regex - csv格式是正规文法还是上下文无关文法?

python - Scrapy不生成outputcsv文件

ruby - 带有问号和 | 的 yaml 格式

css - compass 不同的 css 输出路径和 url 助手

ruby-on-rails - Rails Controller 丢失 JSON 字符串中的换行符

r - 在 csv 文件中写入和加载表达式集

python - 对于每个带有 'phone' 的 pandas 数据帧列,删除非数字