Преобразование странных чисел при чтении CSV-файла с помощью ruby

#ruby #excel #csv

#ruby #excel #csv

Вопрос:

у меня странная проблема в ruby on rails

Существует csv-файл, созданный с помощью Excel 2003.

 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::Ячейка «5437…2534; Отметка; 5»

Файл csv в win1251 (я не могу изменить кодировку файла), файл ruby в UTF8

версия ruby 1.8.4, версия rails 2.0.2

Комментарии:

1. забыл написать: file = params[:upload][‘файл данных’]

Ответ №1:

Если оно действительно имеет странное значение, вероятно, это связано с кодом, который вы не опубликовали. Отредактируйте свой вопрос и включите наименьший фрагмент кода, который будет выполняться независимо и по-прежнему выдавать ваш сомнительный результат.

split() возвращает массив строк. Итак, первое значение вашего CSV-файла — это строка, а не величина. Может быть, вам нужен 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
  

Комментарии:

1. что ж. мне нужно получить ‘5437390264172534’ в качестве значения num, и для меня не имеет значения, какой тип num или его значение. Проблема в том, что значение ‘5437390264172534’ неверно (