2017-02-28 5 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 
関連する問題