2017-02-28 64 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