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?
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?
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
···
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?
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 ] }
Thanks Robert,
Tim Hunter's solution seems most straightforward to me. Which is:
counter = 1
IO.foreach("test.txt") {|line| puts "#{counter}. #{line}"; counter += 1}
The solution that you present:
require 'enumerator'
IO.to_enum(:foreach, "test.txt").inject(0) do |counter, line|
puts "#{counter}. #{line}"
counter + 1
end
Seems like a good one too, except more indirect. When would you
recommend using one over another? Or is it largely a matter of taste?
Also, why do you have to "require" the enumerator module here whereas
Tim's solution didn't. I did a search on "ri IO" and it shows that IO
includes enumerable (it is not enumerator, I know). Also it shows that
foreach is a class method for IO class whereas I could not find anything
on to_enum. Is there a way to get RoR style online API docs for Ruby?
I find "ri" a bit primitive.
Thanks Robert,
Tim Hunter's solution seems most straightforward to me. Which is:
counter = 1
IO.foreach("test.txt") {|line| puts "#{counter}. #{line}"; counter += 1}
The solution that you present:
require 'enumerator'
IO.to_enum(:foreach, "test.txt").inject(0) do |counter, line|
puts "#{counter}. #{line}"
counter + 1
end
Seems like a good one too, except more indirect. When would you recommend using one over another? Or is it largely a matter of taste?
Yes. And there is a ton of other equally good solutions.
Also, why do you have to "require" the enumerator module here whereas Tim's solution didn't.
Because the module is not loaded by default. (IIRC that will change / has changed in Ruby 1.9).
> I did a search on "ri IO" and it shows that IO
includes enumerable (it is not enumerator, I know). Also it shows that foreach is a class method for IO class whereas I could not find anything on to_enum. Is there a way to get RoR style online API docs for Ruby? I find "ri" a bit primitive.
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....
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....
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.