【问题标题】:Ruby CSV converter, remove all converters?Ruby CSV 转换器,删除所有转换器?
【发布时间】:2016-04-28 09:29:39
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个版本的 Ruby?示例源文件是什么样的?您确定该文件不包含 2014 年吗?
  • 欢迎来到 Stack Overflow。在询问有关数据的问题时,提供复制问题所需的最少示例数据至关重要。没有它,以及所需的输出格式,我们只能猜测问题出在哪里。阅读“How to Ask”和“minimal reproducible example”。

标签: ruby date parsing csv converters


【解决方案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

【讨论】:

  • 你说得对! :facepalm: 原版确实有 2014。我比较的记录已经被 excel 触及,出于某种原因我猜 excel 做了 2014 到 14 的格式。
【解决方案2】:

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”变为“2014”。它不知道这是一个日期,而且由于它不是 CSV 转换为对象的地方,它只会适当地拆分字段并将信息传递给开发人员处理。

【讨论】:

  • "字段中的数据以字符串形式返回。始终" - 除非值为空,否则将返回 nil
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2012-02-12
  • 2012-04-10
  • 2016-04-19
  • 1970-01-01
  • 2018-12-23
  • 2010-12-04
相关资源
最近更新 更多