text lines manipulation

G

George George

have a set of lines like shown below:
#set1
1-3
3-5
6-7
#set2
20-23
450-550
#set3
1-50
20-56

The idea is to read each of the lines associated with each set and do
some manipulation?

any easy way of doing this?

Thanks
 
B

Bertram Scharpf

Hi,

Am Montag, 31. Aug 2009, 18:46:53 +0900 schrieb George George:
have a set of lines like shown below:
#set1
1-3
3-5
6-7
#set2
20-23
450-550
#set3
1-50
20-56

The idea is to read each of the lines associated with each set and do
some manipulation?

Untested:

file.each_line { |l|
l.chomp!
case l
when /^#/ then set = $'
else
do_sth_with set, l
end
}

Bertram
 
G

George George

Thanks Betram

This seems to work for me,
dont know whether its efficient or there is a better implementation

file.each_line do |line|
line.chomp!
case line
when /^>/ then set = $'
puts set
else

re1='(\\d+)' # Integer Number 1
re2='(-)' # Any Single Character 1
re3='(\\d+)' # Integer Number 2

re=(re1+re2+re3)
m=Regexp.new(re,Regexp::IGNORECASE);
if m.match(line)
int1 = m.match(line)[1];
c1 = m.match(line)[2];
int2 = m.match(line)[3];
puts int1<< c1 << int2
end
end
end
 
B

Bertram Scharpf

Hi,

Am Montag, 31. Aug 2009, 20:33:19 +0900 schrieb George George:
m=Regexp.new(re,Regexp::IGNORECASE);
if m.match(line)
int1 = m.match(line)[1];
c1 = m.match(line)[2];
int2 = m.match(line)[3];
puts int1<< c1 << int2
end

After `m.match(line)' the match is stored in the $~ global
variable. You don't need to execute it three more times.

$~[1] is equivalent to $1.

The `<<' operator modifieds the string `int1'. Better is here the
operator `+'.

It's sure a matter of taste but in general shorter code is easier
to read.

if line =~ /(\d+)(-)(\d+)/i then
int1 = $1
c1 = $2
int2 = $3
puts int1 + c1 + int2
end

This is for the not faint-hearted:

int1, c1, int2 = *$~.captures

Bertram
 
D

David A. Black

Hi --

Hi,

Am Montag, 31. Aug 2009, 20:33:19 +0900 schrieb George George:
m=Regexp.new(re,Regexp::IGNORECASE);
if m.match(line)
int1 = m.match(line)[1];
c1 = m.match(line)[2];
int2 = m.match(line)[3];
puts int1<< c1 << int2
end

To the OP: definitely lose the semi-colons :)
After `m.match(line)' the match is stored in the $~ global
variable. You don't need to execute it three more times.

$~[1] is equivalent to $1.

The `<<' operator modifieds the string `int1'. Better is here the
operator `+'.

It's sure a matter of taste but in general shorter code is easier
to read.

if line =~ /(\d+)(-)(\d+)/i then
int1 = $1
c1 = $2
int2 = $3
puts int1 + c1 + int2
end

This is for the not faint-hearted:

int1, c1, int2 = *$~.captures

It's a little less formidable without the *, which should be OK. A
mixed solution:

int1, c1, int2 = $1, $2, $3

or use Regexp#match and save the match explicitly.

match = m.match(line)

if match
int1, c1, int2 = match.captures
end

or similar.


David

--
David A. Black / Ruby Power and Light, LLC / http://www.rubypal.com
Ruby/Rails training, mentoring, consulting, code-review
Latest book: The Well-Grounded Rubyist (http://www.manning.com/black2)

September Ruby training in NJ has been POSTPONED. Details to follow.
 
B

Bertram Scharpf

Hi,

Am Montag, 31. Aug 2009, 23:42:43 +0900 schrieb David A. Black:
It's a little less formidable without the *, which should be OK. A
mixed solution:

int1, c1, int2 = $1, $2, $3

There's so much more nice things you can do. I cannot hold it back
any more.

h = {}
...
h[ set] ||= []
h[ set].push int1.to_i..int2.to_i

And so on. Isn't it sweet?

Bertram
 

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

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,528
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top