2009-05-29 11 views
6

Estoy escribiendo una aplicación que gira en torno a obtener conjuntos de datos numéricos de un archivo. Sin embargo, dado que los datos se adquieren en forma de cadena, tengo que convertirlos en flotadores, que es donde comienza la diversión. La sección pertinente de mi código es como se muestra (líneas 65-73):Conversión de matriz de cadenas en matriz de flotantes

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} 

Esto funciona muy bien en IRB, es decir, la última línea cambia el vector de flotadores.

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] 

Sin embargo, cuando ejecuto mi aplicación me sale este 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>' 

Cualquier ayuda con esto sería apreciada.

Respuesta

6

Debería echar un vistazo al formato de "ft" después de leer el archivo.

Cada línea se almacena en otra matriz de lo que en realidad "pies" es como la siguiente:

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

lo que tiene que hacer algo como esto:

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 

Esta es sólo una suposición ya que no sé cómo se ve tu formato de archivo.

Editar:

aquí como una sola línea:

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

Además, no olvide que puede utilizar .inspect para examinar ft: puts ft.inspect –

12

line.scan devuelve una matriz, por lo que está insertando una matriz en una matriz. Lo más fácil sería llamar al flatten en la matriz antes de convertir las cadenas en flotantes.

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 } 
Cuestiones relacionadas