From: Robert Klemme Date: 2009-12-20T21:50:09+09:00 Subject: Re: how to put unique lines from regexped file 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 =~ //..line =~ /<\/prf:CcppAccept>/ >> if line =~ /(image|audio|video).*<\/rdf:li>/ >> line.gsub('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 :) > > puts ss unless ss == @prev; @prev = ss 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[x] = 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 -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/