[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

extract consecutive lines of data

baptiste Auguié

11/24/2007 10:13:00 PM

Hi,


A basic question: how to extract several consecutive lines of numbers
in a text file (example below) and assign them to some GSL::Matrix in
Ruby?

text file:

> some lines of text ...
> ....
> more text
> below is the data to extract
>
> 1 2 3
> 4 5 6
> 7 8 9
> 23 7.3e-8 3.4
>
>
> some more text


from which i would like to create three vectors, a=[1, 4, 7, 23], b=
[2, 5, 8, 7.33-8], c=[3, 6, 9, 3.4]. The line numbers could be used
for indexing if that can help.

Many thanks,

baptiste


8 Answers

Robert Dober

11/25/2007 12:01:00 AM

0

On Nov 24, 2007 11:13 PM, baptiste Augui=E9 <ba208@exeter.ac.uk> wrote:
> Hi,
>
>
> A basic question: how to extract several consecutive lines of numbers
> in a text file (example below) and assign them to some GSL::Matrix in
> Ruby?
>
> text file:
>
> > some lines of text ...
> > ....
> > more text
> > below is the data to extract
> >
> > 1 2 3
> > 4 5 6
> > 7 8 9
> > 23 7.3e-8 3.4
> >
> >
> > some more text
>
>
> from which i would like to create three vectors, a=3D[1, 4, 7, 23], b=3D
> [2, 5, 8, 7.33-8], c=3D[3, 6, 9, 3.4]. The line numbers could be used
> for indexing if that can help.
>
p DATA.readlines.map{ |line| line.chomp.split }.transpose
__END__
1 2 3
4 5 6
7 8 9
23 7.3e-8 3.4
> Many thanks,
>
> baptiste
>
>
HTH
Robert



--=20
what do I think about Ruby?
http://ruby-smalltalk.blo...

baptiste Auguié

11/25/2007 11:31:00 AM

0

Hi,

Thanks for the hints, however it doesn't quite work for me yet. I tried,
> p DATA.readlines.map{ |line| line.chomp.split }.transpose
> __END__
> 1 2 3
> 4 5 6
> 7 8 9
> 23 7.3e-8 3.4

which produces a nice matrix as suggested, but I can't figure how to =20
read that data from an external file rather than below this "__END__" =20=

thing ; nor can I see how to deal with the extra text lines above and =20=

below the data. This is actually the main problem, as I would =20
otherwise go for

> require("rbgsl")
> a, b, c =3D GSL::Vector.filescan(filename)


Thanks again,

baptiste

On 25 Nov 2007, at 00:01, Robert Dober wrote:

> On Nov 24, 2007 11:13 PM, baptiste Augui=E9 <ba208@exeter.ac.uk> =
wrote:
>> Hi,
>>
>>
>> A basic question: how to extract several consecutive lines of numbers
>> in a text file (example below) and assign them to some GSL::Matrix in
>> Ruby?
>>
>> text file:
>>
>>> some lines of text ...
>>> ....
>>> more text
>>> below is the data to extract
>>>
>>> 1 2 3
>>> 4 5 6
>>> 7 8 9
>>> 23 7.3e-8 3.4
>>>
>>>
>>> some more text
>>
>>
>> from which i would like to create three vectors, a=3D[1, 4, 7, 23], =
b=3D
>> [2, 5, 8, 7.33-8], c=3D[3, 6, 9, 3.4]. The line numbers could be used
>> for indexing if that can help.
>>
> p DATA.readlines.map{ |line| line.chomp.split }.transpose
> __END__
> 1 2 3
> 4 5 6
> 7 8 9
> 23 7.3e-8 3.4
>> Many thanks,
>>
>> baptiste
>>
>>
> HTH
> Robert
>
>
>
> --=20
> what do I think about Ruby?
> http://ruby-smalltalk.blo...
>

_____________________________

Baptiste Augui=E9

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

Phone: +44 1392 264187

http://newton.ex.ac.uk/res...
http://projects.ex....
______________________________






MonkeeSage

11/25/2007 12:13:00 PM

0

def input_matrix(file)
File.open(file) { |f|
f.readlines.collect { |line|
line = line.chomp
if line.empty?
then nil
else line.split
end
}.compact.transpose
}
end

p input_matrix(ARGV[0])

^ Composes matrix from first file given on command line, ignoring
blank lines in file.

Regards,
Jordan

baptiste Auguié

11/25/2007 1:24:00 PM

0

Thanks, this didn't work either (the data file contains lines of text =20=

before and after the data).
I've eventually figured a way playing with different bits of code I =20
found:


> # extract space separated numbers from lines 5 to 9 in 'data.txt',
> # ignoring header and footer text lines

> current =3D []
>
> File.foreach('data.txt') do |line|
> if ($. =3D=3D 5) .. ($. =3D=3D 9)
> current << line.scan(/\S+/).map! {|x| x.to_f}
> end
> end
> p current


Best wishes,

baptiste

On 25 Nov 2007, at 12:15, MonkeeSage wrote:

> def input_matrix(file)
> File.open(file) { |f|
> f.readlines.collect { |line|
> line =3D line.chomp
> if line.empty?
> then nil
> else line.split
> end
> }.compact.transpose
> }
> end
>
> p input_matrix(ARGV[0])
>
> ^ Composes matrix from first file given on command line, ignoring
> blank lines in file.
>
> Regards,
> Jordan
>

_____________________________

Baptiste Augui=E9

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

Phone: +44 1392 264187

http://newton.ex.ac.uk/res...
http://projects.ex....
______________________________






Robert Dober

11/25/2007 2:23:00 PM

0

On Nov 25, 2007 2:24 PM, baptiste Augui=E9 <ba208@exeter.ac.uk> wrote:
> Thanks, this didn't work either (the data file contains lines of text
> before and after the data).

grep is your friend

508/8 > cat data.txt && cat detect.rb && ruby detect.rb data.txt
1 2 3
Some text
4 5 6
more text
7 8 9
42 42 42
23 7.3e-8 3.4
#!/usr/local/bin/ruby
# vim: sw=3D2 ts=3D2 ft=3Druby expandtab tw=3D0 nu syn:

p ARGF.readlines.grep(/^\s*[\.\d]/).map{ |line| line.chomp.split }.transpos=
e

[["1", "4", "7", ".42", "23"], ["2", "5", "8", "42", "7.3e-8"], ["3",
"6", "9", "42", "3.4"]]

BTW don't forget to tell us the mark you got ;)

R.
--=20
what do I think about Ruby?
http://ruby-smalltalk.blo...

MonkeeSage

11/25/2007 2:41:00 PM

0

On Nov 25, 8:22 am, Robert Dober <robert.do...@gmail.com> wrote:

> # vim: sw=2 ts=2 ft=ruby expandtab tw=0 nu syn:

Happiness! Another vim user. :)

Regards,
Jordan

baptiste Auguié

11/25/2007 2:54:00 PM

0

Thanks, this is exactly what i was looking for: I just never find my =20
way in these regular expressions, not to mention how to adapt it in =20
Ruby code!

On 25 Nov 2007, at 14:22, Robert Dober wrote:

> On Nov 25, 2007 2:24 PM, baptiste Augui=E9 <ba208@exeter.ac.uk> wrote:
>> Thanks, this didn't work either (the data file contains lines of text
>> before and after the data).
>
> grep is your friend
>

> 508/8 > cat data.txt && cat detect.rb && ruby detect.rb data.txt
> 1 2 3
> Some text
> 4 5 6
> more text
> 7 8 9
> .42 42 42
> 23 7.3e-8 3.4
> #!/usr/local/bin/ruby
> # vim: sw=3D2 ts=3D2 ft=3Druby expandtab tw=3D0 nu syn:
>
> p ARGF.readlines.grep(/^\s*[\.\d]/).map{ |line| =20
> line.chomp.split }.transpose
>
> [["1", "4", "7", ".42", "23"], ["2", "5", "8", "42", "7.3e-8"], ["3",
> "6", "9", "42", "3.4"]]
>
> BTW don't forget to tell us the mark you got ;)
>

do you get a mark for a PhD? I can only tell you the imaginary part =20
is gonna be negative, in terms of propagation constant.


_____________________________

Baptiste Augui=E9

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

Phone: +44 1392 264187

http://newton.ex.ac.uk/res...
http://projects.ex....
______________________________






Robert Dober

11/25/2007 3:46:00 PM

0

On Nov 25, 2007 3:53 PM, baptiste Augui=E9 <ba208@exeter.ac.uk> wrote:
> Thanks, this is exactly what i was looking for: I just never find my
> way in these regular expressions, not to mention how to adapt it in
> Ruby code!
>
> On 25 Nov 2007, at 14:22, Robert Dober wrote:
>
> > On Nov 25, 2007 2:24 PM, baptiste Augui=E9 <ba208@exeter.ac.uk> wrote:
> >> Thanks, this didn't work either (the data file contains lines of text
> >> before and after the data).
> >
> > grep is your friend
> >
>
> > 508/8 > cat data.txt && cat detect.rb && ruby detect.rb data.txt
> > 1 2 3
> > Some text
> > 4 5 6
> > more text
> > 7 8 9
> > .42 42 42
> > 23 7.3e-8 3.4
> > #!/usr/local/bin/ruby
> > # vim: sw=3D2 ts=3D2 ft=3Druby expandtab tw=3D0 nu syn:
> >
> > p ARGF.readlines.grep(/^\s*[\.\d]/).map{ |line|
> > line.chomp.split }.transpose
> >
> > [["1", "4", "7", ".42", "23"], ["2", "5", "8", "42", "7.3e-8"], ["3",
> > "6", "9", "42", "3.4"]]
> >
> > BTW don't forget to tell us the mark you got ;)
> >
>
> do you get a mark for a PhD? I can only tell you the imaginary part
> is gonna be negative, in terms of propagation constant.

Well in that case you just state the sources ;) just kidding, I am
aware that Ruby is only doing some "low" stuff, but still glad you use
it as a tool, and concerning your PhD
"bonne chance".

R.
>
>
>
> _____________________________
>
> Baptiste Augui=E9
>
> Physics Department
> University of Exeter
> Stocker Road,
> Exeter, Devon,
> EX4 4QL, UK
>
> Phone: +44 1392 264187
>
> http://newton.ex.ac.uk/res...
> http://projects.ex....
> ______________________________
>
>
>
>
>
>
>



--=20
what do I think about Ruby?
http://ruby-smalltalk.blo...