Ruby CSV gem返回Infinity而不是double

时间:2015-06-02 17:06:28

标签: ruby postgresql csv double infinity

我有一个方法可以通过CSV文件上传到Postgres。

CSV.foreach(path, converters: :all)

遇到“2.02E + 17”这样的号码时,会上传“2.0150519e + 17”,但遇到“20150515E000590”时会上传“Infinity”。

如果我设置

CSV.foreach(path)

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

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

1 个答案:

答案 0 :(得分:2)

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

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

当Excel看到20150519E000010时,它猜测这是科学记数法20150519e10,即20150519×10 10 。 Excel对电子表格中的基础数据以及显示的方式进行了区分,因此在这种情况下,它会选择更短的方式来显示该数字:{{1 }}。因此,即使Excel向您显示2.02E+17,文件中的实际数据也为2.02E+17

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

然而,我强烈怀疑Excel和Ruby都是错误的。当我看到Infinity时,我看起来像20150515E000059。这不是科学记数法中的数字,而是时间戳!您可以定义用于处理格式的自定义转换器:

2015-05-15 00:00:59