2014-09-18 2 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는 그렇게 좋지 않습니다. k 내가 일치를 사용하여 일치를 사용해야합니다 그리고 그 후 라인의 나머지 부분을 출력합니다 .. 난 그냥 숫자가 원하는 – emvee

답변

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이 작품 .. 내가 "matches.uniq"앞에 "박았"필요가! 하지만 – emvee

+0

배열의 각 요소를 반복하면됩니다. 답변이 업데이트되었습니다. –

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