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
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
Hi,
Am Montag, 31. Aug 2009, 18:46:53 +0900 schrieb George G.:
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
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
Bertram S. wrote:
Hi,
Am Montag, 31. Aug 2009, 18:46:53 +0900 schrieb George G.:
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
Hi –
On Mon, 31 Aug 2009, Bertram S. wrote:
Hi,
Am Montag, 31. Aug 2009, 20:33:19 +0900 schrieb George G.:
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
if line =~ /(\d+)(-)(\d+)/i then
int1 = $1
c1 = $2
int2 = $3
puts int1 + c1 + int2
endThis 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 (The Well-Grounded Rubyist)
September Ruby training in NJ has been POSTPONED. Details to follow.
Hi,
Am Montag, 31. Aug 2009, 23:42:43 +0900 schrieb David A. Black:
On Mon, 31 Aug 2009, Bertram S. wrote:
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
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
Hi,
Am Montag, 31. Aug 2009, 20:33:19 +0900 schrieb George G.:
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
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs