2009-05-29 20 views
6

ファイルから数値データを取得するためのアプリケーションを作成しています。しかし、データは文字列形式で取得されるので、私は浮動小数点数に変換する必要があります。これは楽しい時間が始まるところです。 (ライン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でうまく動作します、つまり、最後の行は、フロートに配列を変更します。私は自分のアプリケーションを実行すると

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

これで任意の助けをいただければ幸いです。

答えて

6

ファイルを読み取った後、 "ft"の形式を調べる必要があります。

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 

これは単なる推測です:

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

だからあなたはこのような何かをする必要があります:

各行には、実際には「FT」は次のようになりますので、別の配列に格納されますあなたのファイル形式がどのようなものかわからないからです。

編集:ワンライナーとしてここ

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

また、.inspectを使ってftを調べることもできます:puts ft.inspect –

12

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 } 
関連する問題