[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Iterators and blocks question

Bharat Ruparel

2/8/2007 10:36:00 PM

I am new to ruby and am trying to learn my way around it. I saw the
following example somewhere on the net to read a file line by line and
list it to the console:

IO.foreach("test.txt") {|line| puts line}

This works great. However, I am trying to take the next step(s). For
starters, I would like to modify the above code such that it lets me
prepend the line numbers to each line as it is listed to the console.
Something similar to the listing below for example:

1. First line from the file..
2. Second line from the file...
.
.
12. Last line from the file.

What is the Ruby idiom for doing this? Using the iterator and the code
block?

Thanks in advance.
Regards,

Bharat

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

13 Answers

Tim Hunter

2/8/2007 10:45:00 PM

0

Bharat Ruparel wrote:
> I am new to ruby and am trying to learn my way around it. I saw the
> following example somewhere on the net to read a file line by line and
> list it to the console:
>
> IO.foreach("test.txt") {|line| puts line}
>
> This works great. However, I am trying to take the next step(s). For
> starters, I would like to modify the above code such that it lets me
> prepend the line numbers to each line as it is listed to the console.
> Something similar to the listing below for example:
>
> 1. First line from the file..
> 2. Second line from the file...
> ..
> ..
> 12. Last line from the file.
>
> What is the Ruby idiom for doing this? Using the iterator and the code
> block?
>
> Thanks in advance.
> Regards,
>
> Bharat
>
>
counter = 1
IO.foreach("test.txt") {|line| puts "#{counter}. #{line}"; counter += 1}


Bharat Ruparel

2/8/2007 10:57:00 PM

0

Thanks.
Bharat

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

oinkoink

2/8/2007 11:26:00 PM

0

On Feb 8, 2:36 pm, Bharat Ruparel <brupa...@mercury.com> wrote:
> IO.foreach("test.txt") {|line| puts line}
>
> This works great. However, I am trying to take the next step(s). For
> starters, I would like to modify the above code such that it lets me
> prepend the line numbers to each line as it is listed to the console.
> Something similar to the listing below for example:
>
> 1. First line from the file..
> 2. Second line from the file...
> .
> .
> 12. Last line from the file.

> What is the Ruby idiom for doing this? Using the iterator and the code
> block?

> Thanks in advance.
> Regards,
> Bharat

> Posted viahttp://www.ruby-....

Namaste Bharat.
You might try something like
require 'mathn'
width = (Math.log((rl = IO.readlines("test.txt")).length)/
Math.log(10)).floor + 1
rl.each_with_index{ |line, k| print "%#{width}d. " % k + line}

Regards, Bret

oinkoink

2/9/2007

0

On Feb 8, 3:25 pm, "oinkoink" <oinkoink+u...@rexx.com> wrote:
> require 'mathn'
> width = (Math.log((rl = IO.readlines("test.txt")).length)/
> Math.log(10)).floor + 1
> rl.each_with_index{ |line, k| print "%#{width}d. " % k + line}

Following up to myself, the idea is to keep from indenting the lines
differently
every time the line number passes a power of 10.
Regards, Bret


Rob Biedenharn

2/9/2007 1:10:00 AM

0

On Feb 8, 2007, at 7:05 PM, oinkoink wrote:
> On Feb 8, 3:25 pm, "oinkoink" <oinkoink+u...@rexx.com> wrote:
>> require 'mathn'
>> width = (Math.log((rl = IO.readlines("test.txt")).length)/
>> Math.log(10)).floor + 1
>> rl.each_with_index{ |line, k| print "%#{width}d. " % k + line}
>
> Following up to myself, the idea is to keep from indenting the lines
> differently
> every time the line number passes a power of 10.
> Regards, Bret

width = (rl = IO.readlines("test.txt")).length.to_s.length
format = "%2$#{width}d: %1$s" # see Kernel#sprintf
rl.each_with_index { |*ary| ary[1] += 1; print format % ary }

The ary[1]+=1 part is to make the numbers 1-based. If you're OK with
the zero, leave it out. Of course, if you want to start with 1, it
makes more sense to do:

number = 0
rl.each { |line| number += 1; print format % [ line, number ] }

or

rl.each_with_index { |line,number| print format % [ line, number
+1 ] }

But then you could go back to the simpler format string and swap the
order of the args yourself.

-Rob

Rob Biedenharn http://agileconsult...
Rob@AgileConsultingLLC.com



Bharat Ruparel

2/9/2007 3:48:00 AM

0

Thank you gentlemen.
Regards,
Bharat

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

Bharat Ruparel

2/9/2007 4:03:00 AM

0

How can one go about looking up this sort of information online? I like
to do a bit of my homework before asking the question except I don't
know where the library is....

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

Rob Biedenharn

2/9/2007 4:18:00 AM

0


On Feb 8, 2007, at 11:03 PM, Bharat Ruparel wrote:

> How can one go about looking up this sort of information online? I
> like
> to do a bit of my homework before asking the question except I don't
> know where the library is....

Try this at your prompt:

ri Kernel#sprintf

ri IO.readlines

and so on. If you don't have a copy of the pickaxe (Programming
Ruby; http://pragmaticprogrammer.com/titles/ruby/...) then
that should be your first book.

Online of course you have:

The Ruby Home Page: http://www.ruby-la...

from which you have links to *much* more than it would be worth my
repeating.

-Rob

Rob Biedenharn http://agileconsult...
Rob@AgileConsultingLLC.com



Robert Klemme

2/9/2007 9:01:00 AM

0

On 08.02.2007 23:44, Timothy Hunter wrote:
> Bharat Ruparel wrote:

> counter = 1
> IO.foreach("test.txt") {|line| puts "#{counter}. #{line}"; counter += 1}

An injectified version of this:

require 'enumerator'
IO.to_enum(:foreach, "test.txt").inject(0) do |counter, line|
puts "#{counter}. #{line}"
counter + 1
end

:-)

robert

Brian Candler

2/9/2007 9:03:00 AM

0

On Fri, Feb 09, 2007 at 01:18:10PM +0900, Rob Biedenharn wrote:
> and so on. If you don't have a copy of the pickaxe (Programming
> Ruby; http://pragmaticprogrammer.com/titles/ruby/...) then
> that should be your first book.

The old version is available to read on-line:
http://www.rubycentral...

It was written for Ruby 1.6, but it basically applies to Ruby 1.8 as well
(it just doesn't document the additions :-) And if you like it, as you
probably will, you can then buy the paper or PDF version of the new one.

> Online of course you have:
>
> The Ruby Home Page: http://www.ruby-la...

and also:
http://wiki.rubygarde...