【问题标题】:Strange number conversion while reading a csv file with ruby使用 ruby​​ 读取 csv 文件时出现奇怪的数字转换
【发布时间】:2011-05-18 08:58:44
【问题描述】:

我在 ruby​​ on rails 中遇到了一个奇怪的问题

有一个用 Excel 2003 制作的 csv 文件。

5437390264172534;Mark;5

我有一个带有上传输入的页面,我像这样读取文件:

file = params[:upload]['datafile']
file.read.split("\n").each do |line|
  num,name,type = line.split(";")
  logger.debug "row: #{num} #{name} #{type}"
end

所以。最后我得到了以下内容:

数字 = 5437...2534 名称 = 标记 类型 = 5

为什么 num 有这么奇怪的值?

我也尝试过这样做:

   str = file.read

   csv = CSV.parse(str)

   csv.each do |line|
      RAILS_DEFAULT_LOGGER.info "@@@@@@@@ #{line.to_yaml}"
   end

但我又得到了

@@@@@@@@ --- - !str:CSV::Cell "5437...2534;Mark;5"

win1251 中的 csv 文件(我无法更改文件编码) UTF8 格式的 ruby​​ 文件

红宝石版本 1.8.4 轨道版本 2.0.2

【问题讨论】:

  • 忘记写了:file = params[:upload]['datafile']

标签: ruby excel csv


【解决方案1】:

如果它确实有一个奇怪的值,它可能与您没有发布的代码有关。编辑您的问题,并包含最少量的代码,这些代码将独立运行并仍会产生您有问题的输出。

split() 返回一个字符串数组。所以 CSV 文件的第一个值是字符串,而不是 Bignum。也许您需要num.to_i,或者在您的代码中某处需要像num.is_a?(Bignum) 这样的测试。

file = File.open("test.csv", "r")

    # Just getting the first line
    line = file.gets
    num,name,type = line.split(";")

    # split() returns an array of String
    puts num.class
    puts num

    # Make num a number
    puts num.to_i.class
    puts num.to_i

file.close

在这里运行该文件会给我这个:

$ ruby test.rb
String
5437390264172534
Bignum
5437390264172534

【讨论】:

  • 好吧。我需要将 '5437390264172534' 作为 num 的值,对于我来说什么类型的 num 或它的值并不重要。问题是值是'5437390264172534'不正确(
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
相关资源
最近更新 更多