Хороший способ обрабатывать много разных файлов? - PullRequest
1 голос
/ 26 июля 2010

Я строю специализированный конвейер, и, по сути, каждый шаг в конвейере включает в себя один файл в качестве входных данных и создание другого файла в качестве выходных данных.Не все файлы находятся в одном и том же каталоге, все выходные файлы имеют другой формат, и, поскольку я использую несколько разных программ, необходимо выполнить разные действия, чтобы успокоить разные программы.

Это привело к некоторому сложному управлению файлами в моем коде, и чем больше я пытаюсь организовать каталоги файлов, тем более уродливым он становится.Почти каждый класс включает в себя какой-то код, подобный следующему:

@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")

Есть ли какой-то шаблон проектирования, рубиновый гем или что-то, чтобы это убрать?Мне нравится писать чистый код, так что это действительно начинает беспокоить меня.

Ответы [ 2 ]

1 голос
/ 27 июля 2010

Вы можете сделать это настолько сложным, насколько захотите, но этот базовый сценарий будет сопоставлять суффикс файла с методом, который затем можно вызвать с путем к файлу.

# 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
1 голос
/ 26 июля 2010

Вы можете использовать Makefile.

Make является существенным DSL, предназначенным для обработки преобразования одного типа файла в другой с помощью запуска внешней программы.В качестве дополнительного бонуса он будет обрабатывать только шаги, необходимые для постепенного обновления вашего вывода, если какой-то набор исходных файлов изменится.

Если вы действительно хотите использовать Ruby, попробуйте rakefile.Рейк сделает это, и это все еще Ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...