Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   extracting values from consecutive lines (http://www.velocityreviews.com/forums/t844966-extracting-values-from-consecutive-lines.html)

baptiste Auguié 10-17-2007 04:03 PM

extracting values from consecutive lines
 

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





Phrogz 10-17-2007 04:20 PM

Re: extracting values from consecutive lines
 
On Oct 17, 10:03 am, baptiste Auguié <ba...@exeter.ac.uk> 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 = 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]]


John Joyce 10-17-2007 04:32 PM

Re: extracting values from consecutive lines
 

On Oct 17, 2007, at 11:03 AM, baptiste Augui=E9 wrote:

>
> Hello,
>
> This is a basic question, as I'm very new to Ruby. I have a text =20
> 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 =20
> consecutive lines (say, from angle =3D 158 to 165). These values =20
> should be stored in some array or vector. How can I do that in Ruby?
>
> Many thanks,
>
> baptiste
>
>
>
>

Many ways to approach it of course.
You could use CSV or FasterCSV since your data file is lines (rows) =20
with columns separated by tabs or spaces.
CSV or FasterCSV might be more useful to do other things also with =20
the data file.
but you can also just read the first 3 or 4 bytes of each line to =20
find the lines you want.=


baptiste Auguié 10-17-2007 05:04 PM

Re: extracting values from consecutive lines
 
thanks so much!

I'll try and use this array with rgsl now...

Best regards,

baptiste

On 17 Oct 2007, at 17:25, Phrogz wrote:

> On Oct 17, 10:03 am, baptiste Augui=E9 <ba...@exeter.ac.uk> 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 }
> }
>
> my_range =3D values.select{ |angle, _|
> (158..165).include?( angle )
> }
>
> require 'pp'
> pp my_range
> #=3D> [[158.0, 0.003214, 0.001719],
> #=3D> [159.0, 0.0031354, 0.0017258],
> #=3D> [160.0, 0.003056, 0.001732],
> #=3D> [161.0, 0.002976, 0.0017378],
> #=3D> [162.0, 0.0028956, 0.0017431],
> #=3D> [163.0, 0.0028148, 0.0017479],
> #=3D> [164.0, 0.0027338, 0.0017523],
> #=3D> [165.0, 0.0026526, 0.0017562]]
>
>


_____________________________

Baptiste Augui=E9

Physics Department
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag
http://projects.ex.ac.uk/atto
______________________________







7stud -- 10-17-2007 05:32 PM

Re: extracting values from consecutive lines
 
Gavin Kistner wrote:
> On Oct 17, 10:03 am, baptiste Augui� <ba...@exeter.ac.uk> 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'
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
--
Posted via http://www.ruby-forum.com/.


William James 10-17-2007 06:07 PM

Re: extracting values from consecutive lines
 
On Oct 17, 11:03 am, baptiste Auguié <ba...@exeter.ac.uk> 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) }


Bertram Scharpf 10-17-2007 06:35 PM

Re: extracting values from consecutive lines
 
Hi,

Am Donnerstag, 18. Okt 2007, 01:03:21 +0900 schrieb baptiste Augui=E9:
>> 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 lin=

es=20
> (say, from angle =3D 158 to 165). These values should be stored in some a=

rray=20
> or vector. How can I do that in Ruby?


Anybody considered ranges?

r =3D 158..165
file.each { |l|
ang, val1, val2 =3D l.split.map { |x| Float x }
r =3D=3D=3D ang and do_sth_with val1, val2
}

r =3D 158..165
file.each { |l|
ang, val1, val2 =3D l.split.map { |x| Float x }
case ang
when r then do_sth_with val1, val2
end
}

Does anybody remember flip-flops?

file.each { |l|
ang, val1, val2 =3D l.split.map { |x| Float x }
iang =3D ang.floor
if (iang=3D=3D158)..(iang=3D=3D165) then
do_sth_with val1, val2
end
}

The floor call is not actually beautiful here but always
keep in mind equality shouldn't be tested for floats.
Flip-flops need equality.

Bertram


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


7stud -- 10-17-2007 07:06 PM

Re: extracting values from consecutive lines
 
William James wrote:
>
> p IO.readlines( 'input.dat').grep( /^\d/ ).
> map{|s| s.strip.split.map{|x| x.to_f}}.select{|a|
> a.first.between?(158,165) }


Better. Still slower.
--
Posted via http://www.ruby-forum.com/.


William James 10-17-2007 09:59 PM

Re: extracting values from consecutive lines
 
On Oct 17, 11:03 am, baptiste Auguié <ba...@exeter.ac.uk> 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) }


Peña, Botp 10-18-2007 02:31 AM

Re: extracting values from consecutive lines
 
RnJvbTogN3N0dWQgLS0gW21haWx0bzpiYnh4Nzg5XzA1c3NAeW Fob28uY29tXSANCiMgV2lsbGlh
bSBKYW1lcyB3cm90ZToNCiMgPiBwIElPLnJlYWRsaW5lcyggJ2 lucHV0LmRhdCcpLmdyZXAoIC9e
XGQvICkuDQojID4gICBtYXB7fHN8IHMuc3RyaXAuc3BsaXQubW Fwe3x4fCB4LnRvX2Z9fS5zZWxl
Y3R7fGF8DQojID4gICAgIGEuZmlyc3QuYmV0d2Vlbj8oMTU4LD E2NSkgfQ0KIyANCiMgQmV0dGVy
LiAgU3RpbGwgc2xvd2VyLg0KDQpob3cgYWJvdXQgdGhpcywNCg 0KYT1bXQ0KQVJHRi5lYWNoIGRv
IHxsaW5lfA0KICBpZiBsaW5lID1+IC8xNTgvIC4uIGxpbmUgPX 4gLzE2NS8NCiAgICBhIDw8IGxp
bmUuc3BsaXQubWFwe3x4fHgudG9fZn0NCiAgZW5kDQplbmQNCg 0KJ2p1c3Qgam9pbmluZyB0aGUg
ZnVuIGluIHJ1YnkgOikNCmtpbmQgcmVnYXJkcyAtYm90cA0KDQ o=



All times are GMT. The time now is 12:36 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.