How to put unique lines from regexped file

Hi all,

I have such a question, when i open a file doing some grep stuff...

···

---
File.open('aa.xml').each do |line|
dev_name = ARGV[1]
        if line =~ /<prf:CcppAccept>/..line =~ /<\/prf:CcppAccept>/
                if line =~ /<rdf:li>(image|audio|video).*<\/rdf:li>/
        line.gsub('<rdf:li>image/jpeg', "INSERT INTO VMPOLICY_VALUES
VALUES(\'#{dev_name}\',\'jpginpage\',\'true\',\'#{$ver}\')")).gsub(
"<\/rdf:li>", ";").each do |ss|
----

I recive output like

INSERT INTO TABLE VALUES(1,1,1)
INSERT INTO TABLE VALUES(1,2,2)
INSERT INTO TABLE VALUES(1,1,1)

now i wanted to put only that lines which are uniqe...
INSERT INTO TABLE VALUES(1,1,1)
INSERT INTO TABLE VALUES(1,2,2)

how i can do this ??

i thought about...

puts ss.unque

but its dont work

Please Help

Regards
beny18241
--
Posted via http://www.ruby-forum.com/.

beny 18241 wrote:

Hi all,

I have such a question, when i open a file doing some grep stuff...

---
File.open('aa.xml').each do |line|
dev_name = ARGV[1]
        if line =~ /<prf:CcppAccept>/..line =~ /<\/prf:CcppAccept>/
                if line =~ /<rdf:li>(image|audio|video).*<\/rdf:li>/
        line.gsub('<rdf:li>image/jpeg', "INSERT INTO VMPOLICY_VALUES
VALUES(\'#{dev_name}\',\'jpginpage\',\'true\',\'#{$ver}\')")).gsub(
"<\/rdf:li>", ";").each do |ss|
----

I recive output like

INSERT INTO TABLE VALUES(1,1,1)
INSERT INTO TABLE VALUES(1,2,2)
INSERT INTO TABLE VALUES(1,1,1)

now i wanted to put only that lines which are uniqe...
INSERT INTO TABLE VALUES(1,1,1)
INSERT INTO TABLE VALUES(1,2,2)

how i can do this ??

i thought about...

puts ss.unque

but its dont work

Please Help

Regards
beny18241

ok i figure it out :slight_smile:

puts ss unless ss == @prev; @prev = ss

cheers

···

--
Posted via http://www.ruby-forum.com/\.

That works only if the input is ordered. For unordered input here's an efficient way:

require 'set'

unique = Set.new

File.foreach('aa.xml') do |line|
   x = ... line ...
   puts x if unique.add? x
end

Of course you can also use a Hash for this.

unique = {}

File.foreach('aa.xml') do |line|
   x = ... line ...

   unique.fetch x do
     unique = true
     puts x
   end
end

Btw, since your input appears to be XML it's probably a better idea to process it with XML tools like REXML and the like.

Kind regards

  robert

···

On 20.12.2009 12:50, beny 18241 wrote:

beny 18241 wrote:

Hi all,

I have such a question, when i open a file doing some grep stuff...

---
File.open('aa.xml').each do |line|
dev_name = ARGV[1]
        if line =~ /<prf:CcppAccept>/..line =~ /<\/prf:CcppAccept>/
                if line =~ /<rdf:li>(image|audio|video).*<\/rdf:li>/
        line.gsub('<rdf:li>image/jpeg', "INSERT INTO VMPOLICY_VALUES
VALUES(\'#{dev_name}\',\'jpginpage\',\'true\',\'#{$ver}\')")).gsub(
"<\/rdf:li>", ";").each do |ss|
----

I recive output like

INSERT INTO TABLE VALUES(1,1,1)
INSERT INTO TABLE VALUES(1,2,2)
INSERT INTO TABLE VALUES(1,1,1)

now i wanted to put only that lines which are uniqe...
INSERT INTO TABLE VALUES(1,1,1)
INSERT INTO TABLE VALUES(1,2,2)

how i can do this ??

i thought about...

puts ss.unque

but its dont work

Please Help

Regards
beny18241

ok i figure it out :slight_smile:

puts ss unless ss == @prev; @prev = ss

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Robert Klemme wrote:

require 'set'

unique = Set.new

File.foreach('aa.xml') do |line|
  x = ... line ...
  puts x if unique.add? x
end

That's fine for the plodding proles, but we cossacks always shout the
battle-cry: "We don't need no stinkin' loops!"

puts IO.readlines('aa.xml').map{|s| s.sub( ... )}.uniq

Everything must be done in one fell swoop or not at all!

···

--

Strong words, but I hope you are aware that this, taken as a general rule, is bad advice.

Cheers

  robert

···

On 20.12.2009 15:40, W. James wrote:

Robert Klemme wrote:

require 'set'

unique = Set.new

File.foreach('aa.xml') do |line|
  x = ... line ...
  puts x if unique.add? x
end

That's fine for the plodding proles, but we cossacks always shout the
battle-cry: "We don't need no stinkin' loops!"

puts IO.readlines('aa.xml').map{|s| s.sub( ... )}.uniq

Everything must be done in one fell swoop or not at all!

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Robert Klemme wrote:

That's fine for the plodding proles, but we cossacks always shout the
battle-cry: "We don't need no stinkin' loops!"

puts IO.readlines('aa.xml').map{|s| s.sub( ... )}.uniq

Everything must be done in one fell swoop or not at all!

Strong words, but I hope you are aware that this, taken as a general
rule, is bad advice.

@geekdom = {@everything.reject {|e| !e.fell_swoop?}}.good_advice? ?
:alive : :dead

:slight_smile:

Cheers

  robert

Best,

···

On 20.12.2009 15:40, W. James wrote:

--
Marnen Laibow-Koser
http://www.marnen.org
marnen@marnen.org
--
Posted via http://www.ruby-forum.com/\.