2014-03-06 32 views
1

我希望能够在生成csv输出时更改CSV使用的日期和时间格式。例如,我不想为日期生成'2004-1-30',而是生成'1/30/2004'。如何控制Ruby CSV使用的输出格式?

我该怎么做?

+0

''1/30/2004''它是“日/月/年”吗? –

+0

@ArupRakshit更有可能[月/日/年](http://en.wikipedia.org/wiki/Calendar_date#Gregorian.2C_month-day-year)。这是美国常用的格式。 – Ajedi32

+0

@ Ajedi32我总是和这个混淆......:p常识在世界上我们从来没有月#30 .. –

回答

3

下面是一个完整的例子:

require 'csv' 
require 'date' 

str = <<_ 
2004-1-30,foo 
2004-11-20,bar 
_ 

File.write('a',str) 

CSV::Converters[:cdate] = lambda do |s| 
    begin 
    Date.strptime(s,"%Y-%m-%d").strftime("%-m/%d/%Y") 
    rescue ArgumentError 
    s 
    end 
end 

CSV.foreach('a',:converters => :cdate) do |row| 
    p row 
end 
# >> ["1/30/2004", "foo"] 
# >> ["11/20/2004", "bar"] 

看的Converters的文档。

从处理定制转换的转换器Hash和/或lambdas名称Array。 单个转换器不必位于阵列中。所有内置转换器在转换之前都会尝试将字段转码为UTF-8。如果数据无法转码,转换将失败,并保持字段不变。

+0

谢谢,奥雅纳。我实际上盯着Converters文档一段时间,并试图手动运行一些转换器,但无法制作它的头部或尾部。我最终得出结论,他们是输入格式器,而不是输出格式器。无论如何,现在我已经有了你的一些示例代码,我会回去尝试去理解它。 –

+0

@PeterAlfvin **请记住** *转换器*仅适用于阅读'CSV'文件。 –

+0

嗯。那么有什么办法可以将常规的'Date'对象提供给'CSV.generate'并通过CSV控制它将它变成字符串时发生了什么?或者所有的对象都通过'.to_s'变成字符串,或者像处理的第一步那样? –