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