Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > text lines manipulation

Reply
Thread Tools

text lines manipulation

 
 
George George
Guest
Posts: n/a
 
      08-31-2009

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

 
Reply With Quote
 
 
 
 
Bertram Scharpf
Guest
Posts: n/a
 
      08-31-2009
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

 
Reply With Quote
 
 
 
 
George George
Guest
Posts: n/a
 
      08-31-2009
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/.

 
Reply With Quote
 
Bertram Scharpf
Guest
Posts: n/a
 
      08-31-2009
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

 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      08-31-2009
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.

 
Reply With Quote
 
Bertram Scharpf
Guest
Posts: n/a
 
      09-01-2009
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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Newby: how to transform text into lines of text vsoler Python 19 01-26-2009 10:38 PM
Preserve blank lines when add multiple lines of text to a cell Cah Sableng Javascript 0 04-23-2007 04:46 AM
Pulling out lines of text from a text file poopdeville@gmail.com Perl Misc 17 03-10-2006 06:02 PM
To delete few lines and add few lines at the end of a text file using c program Murali C++ 2 03-09-2006 04:45 PM
Asp.Net Calender, how to display 5 lines if there are only 5 lines in one month? Jack ASP .Net 9 10-12-2005 03:44 AM



Advertisments