counter

  • Thread starter Lucas Handelsman
  • Start date
L

Lucas Handelsman

Pretty new to ruby (and programming but am getting better).

I am importing data with DBI and I want display and counter as each row
is imported. I can get the display to show:

1
2
3
4
5
6
7
8
9
10
etc...

but I don't want a linebreak after the counter is displayed. I want it
just to keep refreshing itself, basically. Am I missing something with
puts or print or p? Any ideas?
 
G

Gabriele Marrone

Il giorno 02/nov/06, alle ore 01:21, Lucas Handelsman ha scritto:
but I don't want a linebreak after the counter is displayed. I
want it
just to keep refreshing itself, basically. Am I missing something
with
puts or print or p? Any ideas?

This isn't language dependent, and there isn't a "standard" way which
will work under every environment.

Under Unix you can print the character \r to go back to the beginning
of the line, but keep in mind that stdout (unlike stderr) is line
buffered: by default, it prints its output just when a line break is
found. If you want to force it to write to your console, you have to
flush it manually.
Try something like this:

10.times do |i|
print "\r#{i} "
sleep 0.5
$stdout.flush
end
print "\n"

I don't think it would work under Windows. Does it?
Anyway, even if it won't work on a specific console, the user will be
able to understand its output anyway (especially because of the space
I left at the end of the string), so it shouldn't be a big issue.
 
L

Lutz Horn

Lucas said:
but I don't want a linebreak after the counter is displayed.

You can set the varibale $\ (the output record separator for the print
and IO#write, default is nil) to to a value you like.

irb(main):001:0> $\ = "_"
=> "_"
irb(main):002:0> [1, 2, 3].each {|i| print i}
1_2_3_=> [1, 2, 3]

This won't solve the flush problem, though.
 
P

Patrick Spence

Lucas said:
Pretty new to ruby (and programming but am getting better).

I am importing data with DBI and I want display and counter as each row
is imported. I can get the display to show:

1
2
3
4
5
6
7
8
9
10
etc...

but I don't want a linebreak after the counter is displayed. I want it
just to keep refreshing itself, basically. Am I missing something with
puts or print or p? Any ideas?

1.upto(50) {|index|
print("\b" * index.to_s().length << index.to_s())
sleep(0.2)
}
 
P

Patrick Spence

Lucas said:
Thanks guys, I will give it a shot and let you know how it goes.

Sorry about the lack of explanation for the code snippet in my previous
reply...

#-- simple counter from 1 to 50
1.upto(50) {|index|

#-- print the number of backspaces necessary to delete the number,
#-- this is what causes the number to appear to refresh
print("\b" * index.to_s().length << index.to_s())

#-- pause 2/10's of a second before returning to top of loop
sleep(0.2)
}
 

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,774
Messages
2,569,599
Members
45,165
Latest member
JavierBrak
Top