Dismiss
Announcing Stack Overflow Documentation

We started with Q&A. Technical documentation is next, and we need your help.

Whether you're a beginner or an experienced developer, you can contribute.

Sign up and start helping → Learn more about Documentation →

I'm writing an app that revolves around getting sets of numerical data from a file. However, since the data is acquired in string form, I have to convert it to floats, which is where the fun starts. The relevant section of my code is as shown (lines 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}

This works just fine in irb, that is, the last line changes the array to floats.

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]

However when I run my application I get this error:

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>'

Any help with this would be appreciated.

share|improve this question

line.scan returns an array, so you are inserting an array into an array. The easiest thing to do would be to call flatten on the array before you convert the strings to floats.

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 }
share|improve this answer

You should have a look at the format of "ft" after reading the file.

Each line gets stored in another array so in fact "ft" looks something like this:

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

So you have to do something like this:

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

This is just a guess since I don't know what your file format looks like.

Edit:

Here as a one-liner:

ft.flatten!.collect! { |i| i.to_f }
share|improve this answer
    
also don't forget you can use .inspect to examine ft: puts ft.inspect – Ian Terrell May 29 '09 at 20:31

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.