Ruby CSV 转换器,删除所有转换器?

Ruby CSV converter, remove all converters?

我有一些数据正在从一个 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

您确定您的 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

CSV 文件未被解析并转换为对象,字段中的数据被 return 编辑为字符串。总是。此行为不同于 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 个对象的数组会生成 comma-delimited 个值的字符串。

CSV.parse(csv) # => [["foo", "bar", "1", "2014-10-01"]]

重新解析该字符串 return 的字符串版本,但不会尝试 return 它们的原始类型,因为 CSV 无法知道它们是什么。开发人员(您)必须知道并做到这一点。

最重要的是 end-result CSV 不会将年份从“14”更改为“2014”。它不知道这是一个日期,而且,因为它不是 CSV 转换为对象的地方,它只会适当地拆分字段并将信息传递给开发人员。