2013-01-22 28 views
2

在我的xls文件,我有这样的行:红宝石的电子表格格式字符串

8630025500 8630025500  MOBIS/KIA/HYUNDAI ACCENT (ТаГаз) ЭМБЛЕМА "HYUNDAI" 2 2  1 106  

在我的代码读取第二行(8630025500)这样:

row[1].present? ? oem = row[1] : oem = nil 

但在DB我看到863002550.0,但为什么? 为什么它会格式化我的数据?如何设置数据as-in-file-so-in-db? 此外,我尝试:

row[1].present? ? oem = row[1].to_s : oem = nil 

在XLS此行格式的数字(另外,如果我尝试将其设置为普通,我得到同样的结果)...

这里是示例文件,如果你需要:xls file

那么如何导入db数据,比如xls的excel输出呢?

在db我的领域是varchar!

+0

是您的数据库列键入一个浮动或十进制,?这将解释它。 – bdares

+0

@bdares它是字符串,因为在那里我也可以有字符串! –

回答

3

我打得有点与电子表格库和文件,并检查得到的类别的row[1]

irb> sheet.each {|row| print row[1], ' ', row[1].class; puts } 
866202F501 String 
866201F000 String 
866201G600 String 
866201G800 String 
8662026800.0 Float 
866202H010 String 
... 

疑难杂症!它chage!某些值的类型为Float,因此当您调用to_s(或ActiveRecord时,如果不这样做),它会添加.0。这只不过是to_s方法Float的行为:它总是添加小数部分,即使它是零。 数据库在这里没有关系。

也许有可能是更好的解决方案(以某种方式配置电子表格的lib,修改XLS),但最快的手段是:看到浮法 - >转换转换为字符串之前为int。

比较:

irb> sheet.each {|row| puts row[1].is_a?(Numeric) ? row[1].to_i.to_s : row[1] } 
866202F501 
866201F000 
866201G600 
866201G800 
8662026800 
866202H010 

所以,你可以此检查只需添加到您的.present?检查,大概这个包装成一个功能,为了不显得那么难看。这里我使用Numeric而不是Float:它是所有数字的基类,所以万一你以某种方式得到小数或其他东西,它也会被捕获。

UPD:这里谈到的代码示例:您可以替换为下面的一行:而不是整数类型

oem = row[1].is_a?(Numeric) ? row[1].to_i.to_s : row[1] if row[1].present? 
+0

hm ...对我来说很复杂,如何将它添加到我的代码中?像这样:row [1] .present?.is_a?(Numeric)? oem =行[1] .to_i.to_s:oem = nil或什么?如果to_i然后to_s例如为LOL132,我会得到123,不是吗? –

+0

嗯,我的意思是,你必须嵌套你的条件。如果你坚持?:操作符,它会看起来像这样: – NIA

+0

像什么? )did not't understand –

1

您可以将数据保存为数据库中的varchar或字符串,以便它不会更改您的数据。 当你将它拿来就可以申请转换那边

+0

它是字符串,因为在那里我也可以有字符串!在db中是字符串类型!这就是神奇的 –