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

···

--
Posted via http://www.ruby-forum.com/.

Hi,

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

···

Am Montag, 31. Aug 2009, 18:46:53 +0900 schrieb George George:

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

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 Scharpf wrote:

···

Hi,

Am Montag, 31. Aug 2009, 18:46:53 +0900 schrieb George George:

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

--
Posted via http://www.ruby-forum.com/\.

Hi,

     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

···

Am Montag, 31. Aug 2009, 20:33:19 +0900 schrieb George George:

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

Hi --

Hi,

     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:

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

···

On Mon, 31 Aug 2009, Bertram Scharpf wrote:

Am Montag, 31. Aug 2009, 20:33:19 +0900 schrieb George George:

--
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.

Hi,

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

···

Am Montag, 31. Aug 2009, 23:42:43 +0900 schrieb David A. Black:

On Mon, 31 Aug 2009, Bertram Scharpf wrote:

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de