我有一个方法可以通过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”?
答案 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