Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Iterating through a file, sticking iterated array entries in

Reply
Thread Tools

Iterating through a file, sticking iterated array entries in

 
 
Peter Bailey
Guest
Posts: n/a
 
      09-20-2007
I've got an array, a listing of "titles" in an xml file. Basically, I
want to iterate through my file and, wherever I see the tag
<registration>, I want to replace that with <subhead.4>code</subhead.4>,
where "code" is the next entry in the stack of my array. Now, I've tried
this a number of ways and it does it, but, it doesn't cycle through my
array entries. It populates all of my substitutions with just the first
entry in the array, none of the subsequent ones.
...
$codes = []
$codes = xmlfile.scan(/<issueList>\s*<issue +code *="[A-Z]{3}
*">(.*?)<\/issue>\s*?/mi)
...
$codes.each do |code|
puts code
xmlfile.gsub!(/<registration>?/,
"<subhead.4>#{code}</subhead.4>/n<table>")
end

I'm getting the following. My "puts" statement, which is just there for
checking, does indeed list each entry of the array, though.

<subhead.4>Trade (Domestic &amp; Foreign)</subhead.4>/n<table>
which is correct, but, I'm getting it for all 115 occurrences of the
<registration> tag.

Maybe gsub isn't the way to do this. Obviously, I'm trying to iterate
through every instance of <registration> and simply replace it with the
above code. Is gsub not an iteration tool?

Thanks a lot,
Peter
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Morton Goldberg
Guest
Posts: n/a
 
      09-21-2007
On Sep 20, 2007, at 11:41 AM, Peter Bailey wrote:

> I've got an array, a listing of "titles" in an xml file. Basically, I
> want to iterate through my file and, wherever I see the tag
> <registration>, I want to replace that with <subhead.4>code</
> subhead.4>,
> where "code" is the next entry in the stack of my array. Now, I've
> tried
> this a number of ways and it does it, but, it doesn't cycle through my
> array entries. It populates all of my substitutions with just the
> first
> entry in the array, none of the subsequent ones.
> ...
> $codes = []
> $codes = xmlfile.scan(/<issueList>\s*<issue +code *="[A-Z]{3}
> *">(.*?)<\/issue>\s*?/mi)
> ...
> $codes.each do |code|
> puts code
> xmlfile.gsub!(/<registration>?/,
> "<subhead.4>#{code}</subhead.4>/n<table>")
> end
>
> I'm getting the following. My "puts" statement, which is just there
> for
> checking, does indeed list each entry of the array, though.
>
> <subhead.4>Trade (Domestic &amp; Foreign)</subhead.4>/n<table>
> which is correct, but, I'm getting it for all 115 occurrences of the
> <registration> tag.
>
> Maybe gsub isn't the way to do this. Obviously, I'm trying to iterate
> through every instance of <registration> and simply replace it with
> the
> above code. Is gsub not an iteration tool?


The gsub! matches all the substitution targets on the first iteration
of the 'each'; therefore, no matches occur on any subsequent
iterations. Try something like:

<code>
source = <<TEXT
The quick brown
<fox> jumped over
the lazy <dog>
The quick brown
<fox> jumped over
the lazy <dog>
TEXT

codes = %w[a b c d e f g]
source.gsub!(/<(\w*)>/) { c = codes.shift; "<#{c}>#{$1}</#{c}>"}
puts source
</code>

<results>
The quick brown
<a>fox</a> jumped over
the lazy <b>dog</b>
The quick brown
<c>fox</c> jumped over
the lazy <d>dog</d>
</results>

Regards, Morton



 
Reply With Quote
 
 
 
 
Peter Bailey
Guest
Posts: n/a
 
      09-21-2007
Morton Goldberg wrote:
> On Sep 20, 2007, at 11:41 AM, Peter Bailey wrote:
>
>> ...
>> I'm getting the following. My "puts" statement, which is just there
>> above code. Is gsub not an iteration tool?

> The gsub! matches all the substitution targets on the first iteration
> of the 'each'; therefore, no matches occur on any subsequent
> iterations. Try something like:
>
> <code>
> source = <<TEXT
> The quick brown
> <fox> jumped over
> the lazy <dog>
> The quick brown
> <fox> jumped over
> the lazy <dog>
> TEXT
>
> codes = %w[a b c d e f g]
> source.gsub!(/<(\w*)>/) { c = codes.shift; "<#{c}>#{$1}</#{c}>"}
> puts source
> </code>
>
> <results>
> The quick brown
> <a>fox</a> jumped over
> the lazy <b>dog</b>
> The quick brown
> <c>fox</c> jumped over
> the lazy <d>dog</d>
> </results>
>
> Regards, Morton


Thanks a lot, Morton. Yes, I've modified my approach. I just had to
expand my mind to really consider how to contain each discrete thing
that I want in these huge text files I'm getting. Once I've got them all
in an array, I see now that I can do stuff to each entry in the array.
Exactly what I need. Your suggestion helped. Thanks again.
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Iterating a std::vector vs iterating a std::map? carl C++ 5 11-25-2009 09:55 AM
How to pass out the result from iterated function JD Python 5 12-11-2008 02:55 PM
Entering data into Excel, in specific iterated rows/columns reed.adam@gmail.com Ruby 9 08-11-2006 04:53 AM
Using iterators to write in the structure being iterated through? Pierre Thibault Python 10 07-28-2006 09:18 PM
Floating-point bit hacking: iterated nextafter() without loop? Daniel Vallstrom C Programming 7 10-19-2004 01:44 PM



Advertisments