P
Paul van Delst
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
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