2

私のxlsファイルにはそのような行があります:

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

私のコードでは、2番目の行(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ファイル

では、xlsExcel出力などのdbデータをインポートする方法はありますか?

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メソッドの動作Floatです。ゼロであっても、常に小数部を追加します。ここではデータベースは関係ありません。

おそらくもっと洗練された解決策があるかもしれませんが(どういうわけかSpreadsheet libを構成し、xlsを変更します)、最も速いハックは次のとおりです:文字列に変換する前にFloat->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またはstringとしてデータベースに保存できます。あなたがそれをフェッチするとき、あなたはそこに変換を適用することができます

于 2013-01-22T09:14:00.350 に答える