Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > extracting values from consecutive lines

Reply
Thread Tools

extracting values from consecutive lines

 
 
William James
Guest
Posts: n/a
 
      10-18-2007

William James wrote:
> On Oct 17, 11:03 am, baptiste Auguié <(E-Mail Removed)> wrote:
> > Hello,
> >
> > This is a basic question, as I'm very new to Ruby. I have a text file
> > 'input.dat' containing the following data and text:
> >
> > > some text
> > > some text...

> >
> > > angle value1 value2

> >
> > > 156.00 3.3688E-03 1.7040E-03
> > > 157.00 3.2919E-03 1.7118E-03
> > > 158.00 3.2140E-03 1.7190E-03
> > > 159.00 3.1354E-03 1.7258E-03
> > > 160.00 3.0560E-03 1.7320E-03
> > > 161.00 2.9760E-03 1.7378E-03
> > > 162.00 2.8956E-03 1.7431E-03
> > > 163.00 2.8148E-03 1.7479E-03
> > > 164.00 2.7338E-03 1.7523E-03
> > > 165.00 2.6526E-03 1.7562E-03
> > > 166.00 2.5714E-03 1.7597E-03
> > > 167.00 2.4902E-03 1.7628E-03

> >
> > I would like to extract the 3 columns of data for several consecutive
> > lines (say, from angle = 158 to 165). These values should be stored
> > in some array or vector. How can I do that in Ruby?
> >
> > Many thanks,
> >
> > baptiste

>
> p IO.readlines( 'input.dat').grep( /^\d/ ).
> map{|s| s.strip.split.map{|x| x.to_f}}.select{|a|
> a.first.between?(158,165) }


Please pardon my perverse prolixity. I threw in a "strip" even though
my subconscious told me it was superfluous.

p IO.readlines( 'input.dat').grep( /^\d/ ).
map{|s| s.split.map{|x| x.to_f}}.select{|a|
a.first.between?(158,165) }

 
Reply With Quote
 
 
 
 
7stud --
Guest
Posts: n/a
 
      10-18-2007
William James wrote:
> William James wrote:
>> >
>> > > 166.00 2.5714E-03 1.7597E-03

>> p IO.readlines( 'input.dat').grep( /^\d/ ).
>> map{|s| s.strip.split.map{|x| x.to_f}}.select{|a|
>> a.first.between?(158,165) }

>
> Please pardon my perverse prolixity. I threw in a "strip" even though
> my subconscious told me it was superfluous.
>
> p IO.readlines( 'input.dat').grep( /^\d/ ).
> map{|s| s.split.map{|x| x.to_f}}.select{|a|
> a.first.between?(158,165) }


I took out your superfluous grep() too, but it doesn't help your cause
enough.

Peña, Botp wrote:
> how about this,
>
> a=[]
> ARGF.each do |line|
> if line =~ /158/ .. line =~ /165/
> a << line.split.map{|x|x.to_f}
> end
> end
>
> 'just joining the fun in ruby
> kind regards -botp



A winner by a nose.
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
William James
Guest
Posts: n/a
 
      10-18-2007
On Oct 17, 11:03 am, baptiste Auguié <(E-Mail Removed)> wrote:
> Hello,
>
> This is a basic question, as I'm very new to Ruby. I have a text file
> 'input.dat' containing the following data and text:
>
> > some text
> > some text...

>
> > angle value1 value2

>
> > 156.00 3.3688E-03 1.7040E-03
> > 157.00 3.2919E-03 1.7118E-03
> > 158.00 3.2140E-03 1.7190E-03
> > 159.00 3.1354E-03 1.7258E-03
> > 160.00 3.0560E-03 1.7320E-03
> > 161.00 2.9760E-03 1.7378E-03
> > 162.00 2.8956E-03 1.7431E-03
> > 163.00 2.8148E-03 1.7479E-03
> > 164.00 2.7338E-03 1.7523E-03
> > 165.00 2.6526E-03 1.7562E-03
> > 166.00 2.5714E-03 1.7597E-03
> > 167.00 2.4902E-03 1.7628E-03

>
> I would like to extract the 3 columns of data for several consecutive
> lines (say, from angle = 158 to 165). These values should be stored
> in some array or vector. How can I do that in Ruby?
>
> Many thanks,
>
> baptiste


#!awk -f
/^158/, /^165/ { count++
for (i=1; i<=NF; i++)
a[count, i] = $i + 0
}
END {
for (i=1; (i,1) in a; i++)
{ for (j=1; (i,j) in a; j++)
printf "%f ", a[i,j]
print
}
}

 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      10-18-2007
--1926193751-2060514707-1192728797=:19231
Content-Type: MULTIPART/MIXED; BOUNDARY="1926193751-2060514707-1192728797=:19231"

This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

--1926193751-2060514707-1192728797=:19231
Content-Type: TEXT/PLAIN; charset=X-UNKNOWN; format=flowed
Content-Transfer-Encoding: QUOTED-PRINTABLE

Hi --

On Thu, 18 Oct 2007, Phrogz wrote:

> On Oct 17, 10:03 am, baptiste Augui=E9 <(E-Mail Removed)> wrote:
>>> angle value1 value2

>>
>>> 156.00 3.3688E-03 1.7040E-03
>>> 157.00 3.2919E-03 1.7118E-03
>>> 158.00 3.2140E-03 1.7190E-03
>>> 159.00 3.1354E-03 1.7258E-03
>>> 160.00 3.0560E-03 1.7320E-03
>>> 161.00 2.9760E-03 1.7378E-03
>>> 162.00 2.8956E-03 1.7431E-03
>>> 163.00 2.8148E-03 1.7479E-03
>>> 164.00 2.7338E-03 1.7523E-03
>>> 165.00 2.6526E-03 1.7562E-03
>>> 166.00 2.5714E-03 1.7597E-03
>>> 167.00 2.4902E-03 1.7628E-03

>>
>> I would like to extract the 3 columns of data for several consecutive
>> lines (say, from angle =3D 158 to 165). These values should be stored
>> in some array or vector. How can I do that in Ruby?

>
> # Make an array of arrays of numbers
> # based on scanning for non-whitespace characters
> # (all strings will show up as 0.0)
> values =3D IO.readlines( 'input.dat' ).map{ |line|
> line.scan( /\S+/ ).map{ |str| str.to_f }
> }


Or:

require 'scanf'
values =3D IO.readlines('input.dat').map {|line| line.scanf("%f%f%f") }

(Assuming the > at the beginning isn't really part of it -- otherwise
">%f%f%f".)

I'm not entering the speed contest but scanf might be nice for the
conversions.


David

--=20
Upcoming training from Ruby Power and Light, LLC:
* Intro to Ruby on Rails, Edison, NJ, October 23-26
* Advancing with Rails, Edison, NJ, November 6-9
Both taught by David A. Black.
See http://www.rubypal.com for more info!
--1926193751-2060514707-1192728797=:19231--
--1926193751-2060514707-1192728797=:19231--

 
Reply With Quote
 
William James
Guest
Posts: n/a
 
      10-18-2007
On Oct 17, 12:32 pm, 7stud -- <(E-Mail Removed)> wrote:
> Gavin Kistner wrote:
> > On Oct 17, 10:03 am, baptiste Augui? <(E-Mail Removed)> wrote:
> >> > 164.00 2.7338E-03 1.7523E-03
> >> > 165.00 2.6526E-03 1.7562E-03
> >> > 166.00 2.5714E-03 1.7597E-03
> >> > 167.00 2.4902E-03 1.7628E-03

>
> >> I would like to extract the 3 columns of data for several consecutive
> >> lines (say, from angle = 158 to 165). These values should be stored
> >> in some array or vector. How can I do that in Ruby?

>
> > # Make an array of arrays of numbers
> > # based on scanning for non-whitespace characters
> > # (all strings will show up as 0.0)
> > values = IO.readlines( 'input.dat' ).map{ |line|
> > line.scan( /\S+/ ).map{ |str| str.to_f }
> > }

>
> > my_range = values.select{ |angle, _|
> > (158..165).include?( angle )
> > }

>
> > require 'pp'
> > pp my_range
> > #=> [[158.0, 0.003214, 0.001719],
> > #=> [159.0, 0.0031354, 0.0017258],
> > #=> [160.0, 0.003056, 0.001732],
> > #=> [161.0, 0.002976, 0.0017378],
> > #=> [162.0, 0.0028956, 0.0017431],
> > #=> [163.0, 0.0028148, 0.0017479],
> > #=> [164.0, 0.0027338, 0.0017523],
> > #=> [165.0, 0.0026526, 0.0017562]]

>
> On my system, this is faster:
>
> start = '> 163.00'


If you can't guess that "> " isn't actually part of the data,
you could have deduced it from the fact that the o.p. gave
Gavin's program the seal of approval. Gavin's program won't
work if the lines start with "> ". Your program won't work
since the lines don't start with "> ".

> stop = '> 166.00'
> results = []
> get_line = false
>
> File.foreach("data.txt") do |line|
> test_field = line[0, start.length]
>
> if test_field == start
> get_line = true
> end
>
> if get_line
> results << line.split()[1..-1].map{|str| str.to_f}
>
> if test_field == stop
> break
> end
>
> end
> end


Have you thought about doing all of your programming in COBOL?

 
Reply With Quote
 
7stud --
Guest
Posts: n/a
 
      10-18-2007
William James wrote:
>
> #!awk -f
> /^158/, /^165/ { count++
> for (i=1; i<=NF; i++)
> a[count, i] = $i + 0
> }
> END {
> for (i=1; (i,1) in a; i++)
> { for (j=1; (i,j) in a; j++)
> printf "%f ", a[i,j]
> print
> }
> }


baptiste Auguié wrote:
>
> How can I do that in Ruby?
>


If that wasn't clear enough for you, here's another clue: look at the
title of the group you posted to. Does it say 'awk' anywhere?



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

 
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
printing two consecutive lines icebrakers2008@gmail.com Perl Misc 9 08-22-2008 04:37 PM
extract consecutive lines of data baptiste Auguié Ruby 8 11-25-2007 03:46 PM
search/replace for consecutive blank lines sbk Perl Misc 5 03-28-2005 04:31 AM
Finding consecutive lines Peter Perl Misc 7 11-06-2004 08:06 AM
check for consecutive integer values, ordered values GIMME Javascript 1 04-09-2004 01:13 PM



Advertisments