2017-02-28 61 views
-1

我有文件讀取程序。該程序讀取.txt文件並運行一些功能。 我想通過文件名更改功能。 我的.txt文件具有命名規則,如A001.txt,B001,C001..等等。 我現在使用if-else語句來更改函數。通過文件名讀取文件和更改功能

def Function1(input) 
    if filename =~ /A.+\.txt/ 
    some process.... 
    elsif filename =~ /B.+\.txt/ 
    some process.... 
    ..... 
end 

def Funcition2(input) 
    if filename =~ /A.+\.txt/ 
    some process.... 
    elsif filename =~ /B.+\.txt/ 
    some process.... 
     ..... 
end 

我有4,5個更多類似的功能。 我認爲這段代碼效率不高並且不可讀。 閱讀文件時改變功能的最佳方式是什麼?

+0

一個警告。你的第一個正則表達式將匹配文件名'BA001.txt',這可能不是你想要的。它也會匹配'A001.txt2'。你想像這樣'/^A。+ \。txt $ /'錨定你的正則表達式的開始和結束。使其不區分大小寫也是有意義的。 –

回答

0

我喜歡用動態的方法調用這種事情:

def Function1(input) 
    prefix = filename[0].downcase 
    handler = "import_#{preview}_file" 
    handler = 'import_unknown_file' if !respond_to?(handler) 
    send(handler, input) 
end 

def import_a_file(input); end 
def import_b_file(input); end 
def import_unknown_file(input); end 

你可以藉此一步來使其更具可讀性:

HANDLERS_FOR_PREFIXES = { 
    'a'  => :import_account_file, 
    'b'  => :import_balance_file, 
    'default' => :import_other_file 
} 

def Function1(input) 
    prefix = filename[0].downcase 
    handler = HANDLERS_FOR_PREFIXES[prefix] || HANDLERS_FOR_PREFIXES['default'] 
    send(handler, input) 
end 

def import_account_file(input); end 

但是,我會懷疑您的訂單處理文件可能很重要(如果您要導入銀行信息,則需要在導入交易之前導入帳戶)。所以它可能是有道理的做這樣的事情:

FILE_HANDLERS = { 
    'A*.txt' => :import_account_file, 
    'T*.txt' => :import_transaction_file 
} 

def Function1(input) 
    FILE_HANDLERS.each do |file_pattern, handler| 
    Dir.glob(file_pattern).each do |filename| 
     File.open(filename) do |f| 
     f.each_line do |line| 
      parsed_line = parse(parse) 
      send(handler, parsed_line); 
     end 
     end 
    end 
    end 
end 

雖然我會重構,以消除深層嵌套。

最後,隨着代碼變得越來越複雜,您可能需要將其分解爲單獨的類來處理每種類型的文件。這給你很多重用和分解代碼的機會。例如:

class AccountImporter < Importer 
    def initialize(input); end 
    def process 
end 

HANDLERS_FOR_PREFIXES = { 
    'a'  => AccountImporter, 
    ... 
} 

def Function1(input) 
    prefix = filename[0].downcase 
    handler = HANDLERS_FOR_PREFIXES[prefix] || HANDLERS_FOR_PREFIXES['default'] 
    handler.new(input).process 
end