2009-05-29 8 views
6

J'écris une application qui tourne autour de l'obtention de jeux de données numériques à partir d'un fichier. Cependant, puisque les données sont acquises sous forme de chaîne, je dois le convertir en chars, où le plaisir commence. La section pertinente de mon code est comme indiqué (lignes 65-73):Conversion d'un tableau de chaînes en tableau de flèches

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} 

Cela fonctionne très bien dans RIR, qui est, la dernière ligne modifie le tableau à flotteurs.

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] 

Cependant quand je lance ma demande je reçois cette erreur:

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

Toute aide à ce serait apprécié.

Répondre

6

Vous devriez regarder le format de "ft" après avoir lu le fichier.

Chaque ligne est stocké dans un autre tableau donc en fait « ft » ressemble à ceci:

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

Vous devez faire quelque chose comme ceci:

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 

Ceci est juste une supposition puisque je ne sais pas à quoi ressemble votre format de fichier.

Edit:

Ici comme une doublure:

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

N'oubliez pas que vous pouvez utiliser .inspect pour examiner ft: insigne ft.inspect –

12

line.scan retourne un tableau, vous insérez un tableau dans un tableau. La chose la plus simple à faire serait d'appeler flatten sur le tableau avant de convertir les chaînes en flottants.

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 } 
Questions connexes