problem with reading file

L

Li Chen

Hi folks,

I read a file in the following format,extract the second column only,
and push them into an array. My problem is that Ruby reads them as
strings(based on array.inspect) but not as numbers so it is impossible
for me to do the calculation. Any comments?

Thanks,

Li

###filen name: array.text


A 1 B
A 2 B
A 3 B
A 4 B
A 5 B
A 6 B

...

###script

equire 'enumerator'

array=Array.new

File.open('array.text').each{|line| array<<line.split(/\t/)[1]}

#puts array.inspect
array.each_slice(3){|slice|
average=(slice[0]+slice[1]+slice[2])/(3.0)
puts average
}

###output from screen

C:/Ruby/self/file6.rb:8: undefined method `/' for "123":String
(NoMethodError)
from
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
`each_slice'
from C:/Ruby/self/file6.rb:7:in `each'
from C:/Ruby/self/file6.rb:7:in `each_slice'
from C:/Ruby/self/file6.rb:7
 
W

Wilson Bilkovich

Hi folks,

I read a file in the following format,extract the second column only,
and push them into an array. My problem is that Ruby reads them as
strings(based on array.inspect) but not as numbers so it is impossible
for me to do the calculation. Any comments?

Thanks,

Li

###filen name: array.text


A 1 B
A 2 B
A 3 B
A 4 B
A 5 B
A 6 B

...

###script

equire 'enumerator'

array=Array.new

File.open('array.text').each{|line| array<<line.split(/\t/)[1]}

#puts array.inspect
array.each_slice(3){|slice|
average=(slice[0]+slice[1]+slice[2])/(3.0)
puts average
}

###output from screen

C:/Ruby/self/file6.rb:8: undefined method `/' for "123":String
(NoMethodError)
from
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
`each_slice'
from C:/Ruby/self/file6.rb:7:in `each'
from C:/Ruby/self/file6.rb:7:in `each_slice'
from C:/Ruby/self/file6.rb:7

You need to tell Ruby to coerce the strings into integers.

array = []

File.open('array.text') do |file|
file.each_line do |line|
array << line.split[1].to_i
end
end

array.each_slice(3) do |triplet|
average = (slice[0]+slice[1]+slice[2])/3.0
puts average
end
 
L

Li Chen

You need to tell Ruby to coerce the strings into integers.

array = []

File.open('array.text') do |file|
file.each_line do |line|
array << line.split[1].to_i
end
end

array.each_slice(3) do |triplet|
average = (slice[0]+slice[1]+slice[2])/3.0
puts average
end


Thank you very much,

Li
 
R

Robert Klemme

Hi folks,

I read a file in the following format,extract the second column only,
and push them into an array. My problem is that Ruby reads them as
strings(based on array.inspect) but not as numbers so it is impossible
for me to do the calculation. Any comments?

Thanks,

Li

###filen name: array.text


A 1 B
A 2 B
A 3 B
A 4 B
A 5 B
A 6 B

..

###script

equire 'enumerator'

array=Array.new

File.open('array.text').each{|line| array<<line.split(/\t/)[1]}

#puts array.inspect
array.each_slice(3){|slice|
average=(slice[0]+slice[1]+slice[2])/(3.0)
puts average
}

###output from screen

C:/Ruby/self/file6.rb:8: undefined method `/' for "123":String
(NoMethodError)
from
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
`each_slice'
from C:/Ruby/self/file6.rb:7:in `each'
from C:/Ruby/self/file6.rb:7:in `each_slice'
from C:/Ruby/self/file6.rb:7

This can be done by an awk style 1liner :)

18:12:44 [Temp]: cat data
A 1 B
A 2 B
A 3 B
A 4 B
A 5 B
A 6 B
18:13:18 [Temp]: ruby -aF\\t -n -r enumerator -e 'BEGIN{$a=[]};
$a<<$F[1].to_i; END{ $a.each_slice(3){|sl| p
sl.inject(0){|a,b|a+b}/3.0}}' data
2.0
5.0
18:13:34 [Temp]:

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top