2010-07-26 5 views
1

저는 전문화 된 파이프 라인을 구축하고 있습니다. 기본적으로 파이프 라인의 모든 단계에는 하나의 파일을 입력으로 사용하고 다른 파일을 출력으로 만드는 작업이 포함됩니다. 모든 파일이 같은 디렉토리에있는 것은 아니며 모든 출력 파일의 형식이 다르며 여러 프로그램을 사용하고 있기 때문에 여러 프로그램을 달래기 위해 다른 작업을 수행해야합니다.여러 다른 파일을 처리하는 좋은 방법은 무엇입니까?

이로 인해 코드에서 일부 복잡한 파일 관리가 이루어졌으며 파일 디렉토리를 구성하려고 시도할수록 더 못 생겨났습니다. 이 문제를 정리하는 디자인 패턴, 또는 루비 보석, 또는 무언가의 일종이 있습니까

@fileName = File.basename(file) 
@dataPath = "#{$path}/../data/" 

MzmlToOther.new("mgf", "#{@dataPath}/spectra/#{@fileName}.mzML", 1, false).convert 

system("wine readw.exe --mzXML #{@file}.raw #{$path}../data/spectra/#{File.basename(@file + ".raw", ".raw")}.mzXML 2>/dev/null") 

fileName = "#{$path}../data/" + parts[0] + parts[1][6..parts[1].length-1].chomp(".pep.xml") 

: 거의 모든 클래스는 다음과 같은 코드의 일종을 포함한다? 나는 깨끗한 코드를 작성하는 것을 좋아한다. 그래서 이것은 정말로 나를 귀찮게하기 시작했다.

+0

루비 보석이 없으면 언제든지 만들 수 있습니다. – Adrian

+1

생물 정보학 관련 Q & A 사이트 인 [BioStar] (http://biostar.stackexchange.com/)에서이 질문을 할 수도 있습니다. –

답변

1

Makefile을 사용할 수 있습니다.

만들기는 외부 프로그램을 실행하여 한 유형의 파일을 다른 유형으로 변환하는 것을 처리하도록 설계된 DSL이 필수적입니다. 추가 보너스로 일부 소스 파일 세트가 변경되는 경우 출력을 점진적으로 업데이트하는 데 필요한 단계 만 수행합니다.

정말로 Ruby를 사용하려면 rakefile을 사용해보십시오. 레이크도이 일을 할 것이고, 여전히 루비입니다.

+0

앞서 언급했듯이, 이것은 전문화 된 * 파이프 라인입니다. Makefile만으로는 할 수있는 일이 훨씬 더 많습니다. –

+1

@Jesse J Makefile은 임의의 외부 스크립트를 실행할 수 있기 때문에 할 수없는 일이 있음을 알고 있습니다. 아시다시피, Turing-complete입니다. 하지만 제 대답은 레이크 (Rake)입니다. 루비 코드를 타겟에 산재 시키게 할 수 있습니다. – Borealid

1

원하는대로 정교하게 만들 수 있지만이 기본 스크립트는 파일 접미사를 파일 경로와 함께 호출 할 수있는 방법과 일치시킵니다.

# a conversion method can be used for each file type if you want to 
# make the code more readable or if you need to rearrange filenames. 
def htm_convert file 
    "HTML #{file}" 
end 

# file suffix as key, lambda as value, the last uses an external method 
routines = { 
    :log => lambda {|file| puts "LOG #{file}"}, 
    :rb => lambda {|file| puts "RUBY #{file}"}, 
    :haml => lambda {|file| puts "HAML #{file}"}, 
    :htm => lambda {|file| puts htm_convert(file) } 
} 

# this loops recursively through the directory and sub folders 
Dir['**/*.*'].each do |f| 
    suffix = f.split(".")[-1] 
    if routine = routines[suffix.to_sym] 
    routine.call(f) 
    else 
    puts "UNPROCESSED -- #{f}" 
    end 
end 
관련 문제