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了,但是为什么呢?为什么它正在格式化我的数据?如何将数据设置为文件中的数据库?我也试过:

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

在 xls 中,此行格式是数字(如果我尝试将其设置为 common,我会得到相同的结果)...

这是文件示例,如果您需要:xls 文件

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

在 db 中,我的字段是 varchar!

4

2 回答 2

3

我玩了一下 SpreadSheet 库和您的文件,并检查了以下类别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
...

明白了!它收费!一些值的类型是 Float,所以当你调用to_s它们时(或者 ActiveRecord,如果你不调用),它会添加.0. 这只是to_s方法 of的行为Float:它总是添加小数部分,即使它是零。数据库在这里不相关。

可能会有更优雅的解决方案(以某种方式配置电子表格库,修改 xls),但最快的破解是:在转换为 string 之前看到 Float -> converts to 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? 
于 2013-01-22T14:34:30.743 回答
1

您可以将数据保存为数据库中的 varchar 或字符串,这样它就不会更改您的数据。当您获取它时,您可以在那里应用转换

于 2013-01-22T09:14:00.350 回答