Labelled text file parsing...

C

CBlair1986

Hi. What I'd like to do is to take a file like so:
---
Apple
Color: Red
Peel: Yes
Has Core: Yes

Orange
Color: Orange
Peel: Yes
Has Core: No
---
and go through it, line by line, assigning the 'Apple' and 'Orange'
lines to a name attribute on different hashes, and then using the name
before the colons such as 'Color' and 'Peel' as keys for the respective
values.

I'm just asking for a bit of help and guidance, as I'm still not very
keen on using regular expressions that comfortably and all.

Thanks to anyone who helps!
 
J

Jeff Smick

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

An easier way to do this might be to use YAML (http://www.yaml.org)
which is built into Ruby now.
Though, if you'd like this to be more of a project some very simple
RegEx work and running through the text line by line wouldn't be too
difficult.


Hi. What I'd like to do is to take a file like so:
---
Apple
Color: Red
Peel: Yes
Has Core: Yes

Orange
Color: Orange
Peel: Yes
Has Core: No
---
and go through it, line by line, assigning the 'Apple' and 'Orange'
lines to a name attribute on different hashes, and then using the name
before the colons such as 'Color' and 'Peel' as keys for the
respective
values.

I'm just asking for a bit of help and guidance, as I'm still not very
keen on using regular expressions that comfortably and all.

Thanks to anyone who helps!

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)

iD8DBQFDj6vuG9xIoXK+giARAqZWAKDS2jBxdT7uZirjCwY9fDn2kUaTCgCfZoch
VE2fdfkPtrL1k1JOnR3JSis=
=9VvV
-----END PGP SIGNATURE-----
 
J

James Britt

CBlair1986 said:
Hi. What I'd like to do is to take a file like so:
---
Apple
Color: Red
Peel: Yes
Has Core: Yes

Orange
Color: Orange
Peel: Yes
Has Core: No

How is this file created? It looks very much like YAML, and Ruby ships
with a YAML parser, so if you have any say over the file format, make it
valid YAML.

Something like this:


Apple :
Color: Red
Peel: Yes
Has Core: Yes

Orange :
Color: Orange
Peel: Yes
Has Core: No



James



--

http://www.ruby-doc.org - Ruby Help & Documentation
http://www.artima.com/rubycs/ - Ruby Code & Style: Writers wanted
http://www.rubystuff.com - The Ruby Store for Ruby Stuff
http://www.jamesbritt.com - Playing with Better Toys
http://www.30secondrule.com - Building Better Tools
 
W

William James

CBlair1986 said:
Hi. What I'd like to do is to take a file like so:
---
Apple
Color: Red
Peel: Yes
Has Core: Yes

Orange
Color: Orange
Peel: Yes
Has Core: No
---
and go through it, line by line, assigning the 'Apple' and 'Orange'
lines to a name attribute on different hashes, and then using the name
before the colons such as 'Color' and 'Peel' as keys for the respective
values.

table = {}
ARGF.each { |line| line.strip!
next if line == ""
fields = line.split( /: +/ )
if fields.size == 1
$fruit = fields.first
table[$fruit] = {}
else
table[$fruit][fields.first] = fields.last
end
}

p table
 
D

daz

William said:
table = {}
ARGF.each { |line| line.strip!
next if line == ""
fields = line.split( /: +/ )
if fields.size == 1
$fruit = fields.first
table[$fruit] = {}
else
table[$fruit][fields.first] = fields.last
end
}


OK, I saw your $fruit rationale after removing $ ;)

Here's a variation:

#---------------------------------------------------
table = {}; fruit = nil

IO.foreach('fruit.txt') do |line|
k,v = line.strip.split(/: +/)
k or next
v and table[fruit][k] = v or table[fruit=k] = {}
end
#---------------------------------------------------


daz
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,199
Messages
2,571,045
Members
47,643
Latest member
ashutoshjha_1101

Latest Threads

Top