2013-01-22 27 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中是字符串類型!這就是神奇的 –