[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Question about iterators and reading a file

Jon Handler

12/7/2007 7:19:00 PM

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
--
Posted via http://www.ruby-....

4 Answers

Adam Shelly

12/7/2007 8:15:00 PM

0

On 12/7/07, Jon Handler <jhandler@shopping.com> wrote:
> 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

Jon Handler

12/7/2007 10:10:00 PM

0

Adam Shelly wrote:
> On 12/7/07, Jon Handler <jhandler@shopping.com> 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. 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
--
Posted via http://www.ruby-....

Adam Shelly

12/7/2007 10:46:00 PM

0

On 12/7/07, Jon Handler <jhandler@shopping.com> wrote:
> Adam Shelly wrote:
> > On 12/7/07, Jon Handler <jhandler@shopping.com> 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

Jon Handler

12/7/2007 11:36:00 PM

0

> 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
--
Posted via http://www.ruby-....