Text lines manipulation

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 :slight_smile:

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 (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 stringint1’. 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