我有一些数据我正在从一个CSV写入另一个CSV,因为我需要做一些数据操作。
我注意到CSV库有一些默认转换器,它们将我的值看作日期并将其解析为新的日期字符串。
我想知道我是否可以删除所有转换器?我尝试使用我的自定义转换器,但无论我做什么,似乎日期都会被解析。
这是我的代码简化:
require 'csv'
CSV::Converters[:my_converter] = lambda do |value|
value
end
CSV.open('new-data.csv', 'w') do |csv|
data = CSV.read('original-data.csv', :converters => [:my_converter]).each do |row|
csv << row
end
end
例如,值9/30/14 0:00
已更改为9/30/2014 0:00
。
答案 0 :(得分:1)
您确定CSV文件实际上不包含4位数年份吗?试着看puts File.read('original-data.csv')
当我在Ruby 2.1.8上尝试这个时,它没有改变值
require 'csv'
my_csv_data = 'hello,"9/30/14 0:00",world'
CSV.new(my_csv_data).each do |row|
puts row.inspect # prints ["hello", "9/30/14 0:00", "world"], as expected
end
答案 1 :(得分:0)
不会解析CSV文件并将其转换为对象,字段中的数据将作为字符串返回。总是。此行为与YAML或JSON不同,后者会转换回其基本类型。
考虑一下:
require 'csv'
CSV.parse("1,10/1/14,foo") # => [["1", "10/1/14", "foo"]]
所有值都是字符串。
csv = ["foo", 'bar', 1, Date.new(2014, 10, 1)].to_csv # => "foo,bar,1,2014-10-01\n"
转换包含本机Ruby对象的数组会产生一串逗号分隔的值。
CSV.parse(csv) # => [["foo", "bar", "1", "2014-10-01"]]
重新定义该字符串会返回字符串版本但不会尝试将它们返回到原始类型,因为CSV无法知道这些是什么。开发人员(您)必须知道并做到这一点。
所有这一切的最终结果是,CSV不会从“14”和“#14;&#39;到2014年&#39;。它并不知道它是一个约会对象,并且因为它不是CSV转换为对象的地方,它只会适当地拆分字段并传递信息以进行按摩。开发者。