From: Adam Shelly Date: 2007-12-08T07:46:28+09:00 Subject: Re: Question about iterators and reading a file On 12/7/07, Jon Handler wrote: > Adam Shelly wrote: > > On 12/7/07, Jon Handler wrote: > >> I need to advance to the next line of the file within the loop but I > >> can't for the life of me figure out how to do that. This can't be hard, > >> but it's defeated me so far! > >> > > That's the cool thing about 'each' - you don't have to do anything > > else. The code inside the do-end block will be called for each line, > > with l set to that line. > I wasn't clear about this... my problem is that I want to do something > different depending on which line I'm looking at. Here's some psuedo > code: > > for the whole file > read one line with the identifying string > read one line with the count of items > for each item > read one line with the data > end > save the whole record as an object indexed by the identifying string > end > > The problem is that this is not a line-oriented set of data. So I have > to have some kind of nested loop that advances the line counter. Or, > there has to be some record-oriented I/O that lets me process the file > as a set of records. Surely there's some cool, ruby way to do this?!?? > I see - i misunderstood your question. I don't know about cool & rubyish, but I'd skip the each and do something like this: dataset={} File.open("myfile.txt", 'r') do |f| while (!f.eof) name = f.gets.chomp data=[] f.gets.to_i.times { data << f.gets.chomp.split(",") } dataset[name] = data end end p dataset That assumes that record is comma separated and can be stored as a simple array. For a more complicated record, use something like data << MyRecord.new(f.gets.chomp) Hope this helps, -Adam