gpt4 book ai didi

Ruby CSV gem 返回 Infinity 而不是 double

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:39 26 4
gpt4 key购买 nike

我有一个方法可以处理 CSV 文件并上传到 Postgres。

CSV.foreach(path, converters: :all)

当它遇到诸如“2.02E+17”之类的数字时,它会上传“2.0150519e+17”,但当它遇到“20150515E000590”时,它会上传“无穷大”。

如果我设置

CSV.foreach(path)

当遇到“2.02E+17”时,它将“20150519E000010”和“20150515E000590”上传为“20150515E000590”。

我想上传 Excel 中显示的内容。所以在“2.02E+17”的情况下我想上传“2.02E+17”,但在“20150515E000590”的情况下我想上传“20150515E000590”而不是“Infinity”。我想我的问题是如何让 CSV 不使用“Infinity”覆盖“20150515E000590”?

最佳答案

首先,Postgres 可以在没有 Ruby 帮助的情况下处理加载 CSV。至于你的问题……


CSV 不定义数据类型,因此每当您将 CSV 数据读入需要数据类型(如 Excel 或 Ruby)的内容时,程序都必须猜测。

当 Excel 看到 20150519E000010 时,它猜测这是科学计数法 20150519e10,即 20150519×1010。 Excel 区分电子表格中的基础数据 及其显示 的方式,因此在本例中,它选择了一种更短的方式来显示该数字: 2.02E+17。因此,尽管 Excel 显示的是 2.02E+17,但文件中的实际数据20150519E000010

当您在 Ruby 中读取 CSV 并告诉它转换为 Ruby 的数据类型时,它会做出相同的猜测(这是科学记数法)但您会得到不同的显示:2.0150519e+17 .这应该是预料之中的,因为 2.02E+17Excel 缩短显示数字的方式。 Ruby 的数据类型不符合 Excel。这也解释了为什么 20150515E00059 变成了 Infinity。 20150515×1059 对于 Ruby 的 float 据类型来说太大了,因此 Ruby 将其转换为最大可能的 float :Infinity。

但是,我强烈怀疑 Excel 和 Ruby 都错了。当我看到 20150515E000059 时,它看起来像 2015-05-15 00:00:59。这不是科学计数法中的数字,而是时间戳!您可以定义一个自定义转换器来处理格式:

CSV::Converters[:mytime] = lambda do |s|
DateTime.parse(s.tr(?E, ?T)) rescue s
end

CSV.parse("20150515000019", converters: :mytime)
# [[#<DateTime: 2015-05-15T00:00:19+00:00 ((2457158j,19s,0n),+0s,2299161j)>]]

关于Ruby CSV gem 返回 Infinity 而不是 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30602338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com