1

次のことを行うスクリプトを作成しようとしています。

ディレクトリ A と B の 2 つのディレクトリがあります。ディレクトリ A には、「today」と「today1」というファイルがあります。ディレクトリ B には、「today」、「today1」、「otherfile」という 3 つのファイルがあります。

ディレクトリ A 内のファイルをループ処理し、ディレクトリ B 内の類似した名前のファイルをディレクトリ A 内のファイルに追加したいと考えています。

これを処理するために以下の方法を書きましたが、これが順調に進んでいるかどうか、またはそのようなケースを処理するためのより簡単な方法があるかどうかはわかりませんか?

ディレクトリ B からスクリプトを実行していることに注意してください。

def append_data_to_daily_files
  directory = "B"
  Dir.entries('B').each do |file|
    fileName = file
    next if file == '.' or file == '..'
    File.open(File.join(directory, file), 'a') {|file|
      Dir.entries('.').each do |item|
        next if !(item.match(/fileName/))
        File.open(item, "r")
        file<<item
        item.close
      end
      #file.puts "hello"
      file.close
    }
  end
end
4

2 に答える 2

2

私の意見では、あなたのappend_data_to_daily_files()方法はあまりにも多くのことをしようとしています。ロジックを非常に小さなステップに分割し、各ステップに簡単なメソッドを記述します。その道に沿ったスタートがここにあります。

require 'set'

def dir_entries(dir)
  Dir.chdir(dir) {
    return Dir.glob('*').to_set
  }
end

def append_file_content(target, source)
  File.open(target, 'a') { |fh|
    fh.write(IO.read(source))
  }
end

def append_common_files(target_dir, source_dir)
  ts = dir_entries(target_dir)
  ss = dir_entries(source_dir)
  common_files = ts.intersection(ss)

  common_files.each do |file_name|
    t = File.join(target_dir, file_name)
    s = File.join(source_dir, file_name)
    append_file_content(t, s)
  end
end

# Run script like this:
#   ruby my_script.rb A B    
append_common_files(*ARGV)

を使用するSetと、共通ファイルを簡単に把握できます。を使用globすることで、ドット ディレクトリを除外する手間を省くことができます。コマンド ラインからディレクトリ名を取得するようにコードを設計することで (スクリプトで名前をハードコーディングするのではなく)、最終的に再利用可能なツールを作成できます。

于 2013-05-05T23:50:11.977 に答える
0

私の解決策....

def append_old_logs_to_daily_files
                directory = "B"
                #For each file in the folder "B"
                Dir.entries('B').each do |file|
                    fileName = file
                    #skip dot directories
                    next if file == '.' or file == '..'
                    #Open each file 
                    File.open(File.join(directory, file), 'a') {|file|
                        #Get each log file from the current directory in turn
                        Dir.entries('.').each do |item|
                            next if item == '.' or item == '..'
                            #that matches the day we are looking for
                            next if !(item.match(fileName))
                            #Read the log file
                            logFilesToBeCopied = File.open(item, "r")
                            contents = logFilesToBeCopied.read

                            file<<contents
                    end
                    file.close
                }
            end
        end
于 2013-05-06T10:25:28.353 に答える