2014-09-18 153 views
0

这是我的代码红宝石脚本:看跌删除重复循环

pattern = /066-\d\d\d\-\d\d\d\-\d\d\d\-\d\d\/
Dir['c:/WurtsmithClean/DRCs/*.txt'].each do |file| 
    next unless File.file?(file) 
     File.open(file) do |f| 
      f.each_line do |line| 
       if line.match(pattern) 
        ln = line.match(pattern) 
        file.gsub!('c:/WurtsmithClean/DRCs/', '') 
        file.gsub!('txt', 'pdf') 
        puts file + "," + ln.to_s 
       end 
      end 
     end 
end 

所以这个脚本看重的是“066 - ### - ### - ### - ##”匹配模式中所有文本文件在每行的c:/ WurtsmithClean/DRCs /目录中,并输出文件名和匹配,两者之间用逗号分隔以便导入CSV。

但我一直在试图弄清楚如何删除重复的匹配,因为它发现多个匹配具有相同的文件名相同的数字。我希望这些删除。我尝试过使用UNIQ()方法,但它似乎只适用于数组。虽然整个输出在技术上是循环完成后的数组,但我不知道如何将最终输出作为数组引用并删除重复项。

这里的输出是现在怎么样:

066-018-400-001-00 DRC#26.pdf,066-018-400-001-00 
066-018-400-001-00 DRC#26.pdf,066-018-400-001-00 
066-019-100-001-00 DRC#19.pdf,066-019-100-001-00 
066-019-100-001-00 DRC#19.pdf,066-019-100-001-00 
066-019-100-001-00 DRC#19.pdf,066-019-100-001-00 
066-019-100-001-00 DRC.pdf,066-019-100-001-00 
066-020-100-001-00 DRC#20.pdf,066-020-100-001-00 
066-020-100-001-00 DRC#20.pdf,066-020-100-001-00 
066-020-100-001-00 DRC#20.pdf,066-020-100-001-00 
066-020-100-001-00 DRC#20.pdf,066-020-100-001-00 

我希望它这样的输出(无重复):

066-018-400-001-00 DRC#26.pdf,066-018-400-001-00 
066-019-100-001-00 DRC#19.pdf,066-019-100-001-00 
066-019-100-001-00 DRC.pdf,066-019-100-001-00 
066-020-100-001-00 DRC#20.pdf,066-020-100-001-00 
+0

CarySwoveland no that does not wor k我需要使用匹配作为发现将输出匹配和其余的线后..我只是想要数字 – emvee 2014-09-18 20:02:31

回答

1

您可以填写沿途的阵列。一旦你完成,然后使用uniq

matches = [] 
pattern = /066-\d\d\d\-\d\d\d\-\d\d\d\-\d\d\/
Dir['c:/WurtsmithClean/DRCs/*.txt'].each do |file| 
    next unless File.file?(file) 
    File.open(file) do |f| 
    f.each_line do |line| 
     if line.match(pattern) 
     ln = line.match(pattern) 
     file.gsub!('c:/WurtsmithClean/DRCs/', '') 
     file.gsub!('txt', 'pdf') 
     matches << file + "," + ln.to_s 
     end 
    end 
    end 
end 
matches.uniq.each { |match| puts match } 
+0

THX这工作..我需要把一个“puts”在“matches.uniq!”前面。尽管 – emvee 2014-09-18 20:14:55

+0

只是遍历数组的每个元素。答案已更新。 – 2014-09-18 20:19:18

1

也许你可以做这样的事情,每个文件:

首先,我会进行测试的小文件:

FNAME= 'test1' 

text =<<_ 
pig11 
cat12 
hat13 
rat14 
dog15 
_ 

File.write(FNAME, text) 

现在让我们来看看对第一线该文件匹配模式/t\d+/(说),然后提取数字:

pattern = /t(\d+)/ 
File.open(FNAME) do |f| 
    ln = f.find { |l| l =~ pattern } 
    puts "found '#{ln[pattern,1]}' in line #{ln.chomp} in file #{FNAME}" if ln 
end 
    #=> found '12' in line cat12 in file test1