Extract consecutive lines of data

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

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.

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

···

On Nov 24, 2007 11:13 PM, baptiste Auguié <ba208@exeter.ac.uk> wrote:

--
what do I think about Ruby?
http://ruby-smalltalk.blogspot.com/

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 read that data from an external file rather than below this "__END__" thing ; nor can I see how to deal with the extra text lines above and below the data. This is actually the main problem, as I would otherwise go for

require("rbgsl")
a, b, c = 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é <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=[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.

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

--
what do I think about Ruby?
http://ruby-smalltalk.blogspot.com/

_____________________________

Baptiste Auguié

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
______________________________

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

Thanks, this didn't work either (the data file contains lines of text before and after the data).
I've eventually figured a way playing with different bits of code I found:

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

current =

File.foreach('data.txt') do |line|
if ($. == 5) .. ($. == 9)
         current << line.scan(/\S+/).map! {|x| x.to_f}
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 = 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é

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
______________________________

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=2 ts=2 ft=ruby expandtab tw=0 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 :wink:

R.

···

On Nov 25, 2007 2:24 PM, baptiste Auguié <ba208@exeter.ac.uk> wrote:

Thanks, this didn't work either (the data file contains lines of text
before and after the data).

--
what do I think about Ruby?
http://ruby-smalltalk.blogspot.com/

Happiness! Another vim user. :slight_smile:

Regards,
Jordan

···

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:

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é <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=2 ts=2 ft=ruby expandtab tw=0 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 :wink:

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.

_____________________________

Baptiste Auguié

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
______________________________

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!

>> 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=2 ts=2 ft=ruby expandtab tw=0 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 :wink:
>

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 :wink: 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.

···

On Nov 25, 2007 3:53 PM, baptiste Auguié <ba208@exeter.ac.uk> wrote:

On 25 Nov 2007, at 14:22, Robert Dober wrote:
> On Nov 25, 2007 2:24 PM, baptiste Auguié <ba208@exeter.ac.uk> wrote:

_____________________________

Baptiste Auguié

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

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag
Attogram Project Site - Index
______________________________

--
what do I think about Ruby?
http://ruby-smalltalk.blogspot.com/