2009-05-29 21 views
6

Ich schreibe eine App, die sich um das Abrufen von Mengen von numerischen Daten aus einer Datei dreht. Da die Daten jedoch in String-Form vorliegen, muss ich sie in Floats umwandeln, wo der Spaß beginnt. Der entsprechende Abschnitt meines Codes als (Zeilen 65 bis 73) gezeigt:Konvertieren von Array von Strings in Array von 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.collect! {|i| i.to_f} 

Dies funktioniert in irb ganz gut, das heißt, die letzte Zeile ändert das Array schwimmt.

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] 

Allerdings, wenn ich meine Anwendung ausführen bekomme ich diesen Fehler:

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

Alle mit dieser Hilfe würde geschätzt.

Antwort

6

Sie sollten sich nach dem Lesen der Datei das Format von "ft" ansehen.

wird jede Zeile in einem anderen Array gespeichert, so in der Tat "ft" etwa wie folgt aussieht:

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

Also muss man etwas tun:

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 

Dies ist nur eine Vermutung da ich nicht weiß, wie dein Dateiformat aussieht.

Edit:

Hier als Einzeiler:

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

auch nicht vergessen Sie können .inspect zu prüfen ft: puts ft.inspect verwenden –

12

line.scan ein Array zurückgibt, so dass Sie ein Array in ein Array einfügen. Am einfachsten wäre es, flatten auf dem Array aufzurufen, bevor Sie die Zeichenfolgen in Floats konvertieren.

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 } 
Verwandte Themen