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 转换为对象的地方,它只会适当地拆分字段并将信息传递给开发人员。
我有一些数据正在从一个 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 转换为对象的地方,它只会适当地拆分字段并将信息传递给开发人员。