text lines manipulation

Discussion in 'Ruby' started by George George, Aug 31, 2009.

  1. 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/.
    George George, Aug 31, 2009
    #1
    1. Advertising

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


    --
    Bertram Scharpf
    Stuttgart, Deutschland/Germany
    http://www.bertram-scharpf.de
    Bertram Scharpf, Aug 31, 2009
    #2
    1. Advertising

  3. 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/.
    George George, Aug 31, 2009
    #3
  4. 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

    --
    Bertram Scharpf
    Stuttgart, Deutschland/Germany
    http://www.bertram-scharpf.de
    Bertram Scharpf, Aug 31, 2009
    #4
  5. Hi --

    On Mon, 31 Aug 2009, Bertram Scharpf wrote:

    > 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.
    David A. Black, Aug 31, 2009
    #5
  6. Hi,

    Am Montag, 31. Aug 2009, 23:42:43 +0900 schrieb David A. Black:
    > On Mon, 31 Aug 2009, Bertram Scharpf 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


    --
    Bertram Scharpf
    Stuttgart, Deutschland/Germany
    http://www.bertram-scharpf.de
    Bertram Scharpf, Sep 1, 2009
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jack
    Replies:
    9
    Views:
    2,656
  2. Joe Wright
    Replies:
    0
    Views:
    510
    Joe Wright
    Jul 27, 2003
  3. lovecreatesbeauty

    How to know two lines are a pare parallel lines

    lovecreatesbeauty, Apr 27, 2006, in forum: C Programming
    Replies:
    11
    Views:
    656
    Old Wolf
    Apr 28, 2006
  4. Murali
    Replies:
    2
    Views:
    559
    Jerry Coffin
    Mar 9, 2006
  5. Cah Sableng
    Replies:
    0
    Views:
    236
    Cah Sableng
    Apr 23, 2007
Loading...

Share This Page