Iterating through a file, sticking iterated array entries in

P

Peter Bailey

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
 
M

Morton Goldberg

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
 
P

Peter Bailey

Morton said:
...
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.
 

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,774
Messages
2,569,598
Members
45,151
Latest member
JaclynMarl
Top