/ / Ruby Script: Премахване на дубликати от поставя Loop - рубин, съвпадение на шаблони, дублиране - премахване

Ruby Script: Премахване на дубликати от поставя Loop - рубин, съвпадение на шаблони, дублиране-премахване

Това е моят код

pattern = /066-ddd-ddd-ddd-dd /
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

Отговори:

1 за отговор № 1

Можете да запълнете масива по протежение на пътя. И тогава използвайте uniq когато го направите.

matches = []
pattern = /066-ddd-ddd-ddd-dd /
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 за отговор № 2

Може би бихте могли да направите нещо подобно за всеки файл:

Първо, ще направя малък файл за тестване:

FNAME= "test1"

text =<<_
pig11
cat12
hat13
rat14
dog15
_

File.write(FNAME, text)

Сега нека търсим първия ред на файла, който съответства на шаблона /td+/ (да речем), и след това извлечете числото:

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