Question about iterators and reading a file

J

Jon Handler

Hi All,

I'm trying to write a loop to read in a file with the following
structure:

<identifying string>
<count of records to follow>
<record 1: string, int>
<record 2: string, int>
...
<record n: string, int>
<next identifying string>
...



And I have this piece of loop:

f = open(File, 'r').each do |l|
strIn = l.chomp

# Now what!?!!

end


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!

TIA

Jon
 
A

Adam Shelly

Hi All,
And I have this piece of loop:

f = open(File, 'r').each do |l|
strIn = l.chomp

# Now what!?!!

end

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. Try adding 'puts strln' in place of "Now
what". That will print the whole file. Then replace the puts with
whatever processing you want to do on each line.

-Adam
 
J

Jon Handler

Adam said:
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. Try adding 'puts strln' in place of "Now
what". That will print the whole file. Then replace the puts with
whatever processing you want to do on each line.

-Adam

Hi. Thanks for responding!

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?!??

Thanks again,

Jon
 
A

Adam Shelly

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
 
J

Jon Handler

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,

Yay! That was it.

I do think that there should be something that takes a block and calls
that block for each record in the file. The block would read a record
and also advance the file pointer. Actually you could rewrite the above
like that.

Jon
 

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

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top