On Thu, 25 Jan 2007, Paul van Delst wrote:

> Hello,
>
> As I use ruby more and more for things, I find myself creating "Config" 
> classes, filling them with data read from a simple text file, and then 
> passing instances of config around to do all the work. What I would like to 
> get some advice on, or links to, is ruby-ish methods of reading/parsing text 
> files.
>
> A lot of text files have, for example, some sort of header that says how much 
> data is coming, followed by the data itself, e.g.
>
> Number of data points: 5
> 1 2
> 3 4
> 5 6
> 7 8
> 9 0
> Number of data points: 2
> 10 20
> 11 21
> Number of data points: 20
> 1 2
> 2 3
> ..etc..
>
> Or, svn log output where the header line says how many lines of log message 
> follow.
>
> I find I'm struggling to figure out a tidy way to read these sorts of files. 
> If, for example, I iterate over the lines,
>
> IO.readlines(file_name).each do |line|
>  ...parse the line
> end
>
> How do I take advantage of the fact that the "header" line tells me how much 
> actual data follows before the next header? I.e. I discover that I need to 
> read 5 point so I read 5 points and the next line that is parsed in the above 
> iteration is the next header line. Sort of short-circuiting the iteration.
>
> The solution I've come up with so far is to use "sentinel" values that flag 
> what is to come, but it's yuckily kludgy. Any tips from the 'sperts?
>
> Apologies if this is a CS101 type of question.
>
> cheers,
>
> paulv

yaml is your good friend:

harp:~ > cat a.rb
require 'yaml'
points = YAML.load(IO.read('points.yml'))
p points.size
points.each{|point| p point}

harp:~ > cat points.yml
---
- [10, 20]
- [11, 21]

harp:~ > ruby a.rb
2
[10, 20]
[11, 21]


and so much more...

regards.

-a
-- 
we can deny everything, except that we have the possibility of being better.
simply reflect on that.
- the dalai lama