[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

problem with reading file

Li Chen

10/20/2006 3:25:00 PM

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



--
Posted via http://www.ruby-....

3 Answers

Wilson Bilkovich

10/20/2006 3:41:00 PM

0

On 10/20/06, Li Chen <chen_li3@yahoo.com> wrote:
> 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

Li Chen

10/20/2006 4:07:00 PM

0


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

--
Posted via http://www.ruby-....

Robert Klemme

10/20/2006 4:16:00 PM

0

On 20.10.2006 17:25, Li Chen wrote:
> 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