CSV文件中的BigDecimals数组

时间:2015-05-25 17:43:24

标签: ruby ruby-on-rails-4

在我的Rails应用程序中,我需要从CSV文件创建一个BigDecimal数组。这段代码

eval("[#<BigDecimal:7fabfeadef60,'0.6E1',9(18)>, #<BigDecimal:7fabfeadef10,'0.22995E5',9(18)>]") 

产生以下错误消息

SyntaxError: (eval):1: syntax error, unexpected end-of-input, expecting ']'
...fabfeadef10,'0.22995E5',9(18)>]
...                               ^

我该怎么办?

2 个答案:

答案 0 :(得分:1)

为了澄清Arthur和steenslag写的内容,你试图eval不是Ruby代码的东西。

#<BigDecimal:...>

不是Ruby代码,它就是你在BigDecimal对象上调用inspect时得到的结果,即文本表示意味着人类阅读以帮助调试,而不是Ruby可以读取的表示。< / p>

您不应将BigDecimal#inspect的结果存储在CSV文件中;你应该存储to_s的结果,它将是科学记数法中数字的字符串表示,例如0.22995E5to_s("F"),它们将采用浮点表示法。这样,当您读取CSV文件时,可以使用

将字符串加载回BigDecimal对象
BigDecimal.new(str)

此处不应该使用eval。每当你发现自己使用eval时,这是一个大红旗,告诉你应该重新考虑你的程序设计。

答案 1 :(得分:0)

此字符串不是存储数组的最佳方式。检索信息有点笨拙,如下所示。看看Marshal是否有转储和恢复对象。

require "bigdecimal"

str = "[#<BigDecimal:7fabfeadef60,'0.6E1',9(18)>, #<BigDecimal:7fabfeadef10,'0.22995E5',9(18)>]"

ar = str.split(">, #").map do |el|
  value  = el.split(",")[1][2..-2]
  BigDecimal.new(value)
end

p ar # => [#<BigDecimal:2161280,'0.6E1',9(18)>, # =><BigDecimal:21610c8,'0.22995E5',9(18)>]

# Much easier: Marshal

dumped = Marshal.dump(ar)
p retrieved = Marshal.load(dumped) # => [#<BigDecimal:f3cfa0,'0.6E1',9(18)>, #<BigDecimal:f3cf00,'0.22995E5',9(18)>]