Преобразование массива строк в массив поплавков - PullRequest
6 голосов
/ 29 мая 2009

Я пишу приложение, которое вращается вокруг получения наборов числовых данных из файла. Однако, поскольку данные собираются в виде строки, мне нужно преобразовать их в числа с плавающей точкой, где начинается самое интересное. Соответствующий раздел моего кода выглядит так (строки 65-73):

    ft = []
    puts "File Name: #{ARGV[0]}"
    File.open(ARGV[0], "r") do |file|
        file.each_line do |line|
            ft << line.scan(/\d+/)
        end
    end

ft.collect! {|i| i.to_f}

Это прекрасно работает в irb, то есть последняя строка меняет массив на float.

irb(main):001:0> ft = ["10", "23", "45"]
=> ["10", "23", "45"]
irb(main):002:0> ft.collect! {|i| i.to_f}
=> [10.0, 23.0, 45.0]

Однако, когда я запускаю свое приложение, я получаю эту ошибку:

ruby-statistics.rb:73:in `block in <main>': undefined method `to_f' for #<Array:
0x50832c> (NoMethodError)
        from ruby-statistics.rb:73:in `collect!'
        from ruby-statistics.rb:73:in `<main>'

Любая помощь с этим будет оценена.

Ответы [ 2 ]

12 голосов
/ 29 мая 2009

line.scan возвращает массив, поэтому вы вставляете массив в массив. Проще всего было бы вызвать flatten для массива перед тем, как преобразовать строки в числа с плавающей точкой.

ft = []
puts "File Name: #{ARGV[0]}"
File.open(ARGV[0], "r") do |file|
    file.each_line do |line|
            ft << line.scan(/\d+/)
    end
end

ft = ft.flatten.collect { |i| i.to_f }
6 голосов
/ 29 мая 2009

Вы должны взглянуть на формат "ft" после прочтения файла.

Каждая строка хранится в другом массиве, поэтому на самом деле «ft» выглядит примерно так:

[["1","2"],["3","4"]]

Итак, вы должны сделать что-то вроде этого:

ft = []
puts "File Name: #{ARGV[0]}"
File.open(ARGV[0], "r") do |file|
    file.each_line do |line|
            ft << line.scan(/\d+/)
    end
end

tmp = []

ft.each do |line|
    line.each do |number|
        tmp << number.to_f
    end
end

puts tmp

Это всего лишь предположение, поскольку я не знаю, как выглядит ваш формат файла.

Edit:

Здесь как однострочный:

ft.flatten!.collect! { |i| i.to_f }
...