Ruby Script:从puts Loop中删除重复项

时间:2014-09-18 19:49:35

标签: ruby pattern-matching duplicate-removal

这是我的代码

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

因此,此脚本在每行的c:/ WurtsmithClean / DRCs /目录中的所有文本文档中查找匹配模式“066 - ### - ### - ### - ##”并输出文件名和匹配均以逗号分隔,用于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 

2 个答案:

答案 0 :(得分: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 }

答案 1 :(得分: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