干掉文本解析和ARGV

时间:2014-08-12 16:58:24

标签: ruby optimization dry

尝试在日志文件上迭代多个步骤,并通过命令行输入将每个步骤附加到文本。我目前有工作代码,但问题是有很多重复的数据以及我必须为每个步骤创建一个方法,而我希望只有一个方法能够迭代第一步到... 。"无限"如果有必要,基本上可以采取我拍摄的任何步骤。

@log_file = "07-07-14 to 07-13-14_debug.log"

def s1
  File.readlines(@log_file).each do |line|
    if line.match /Recording dut_serial_number/
      File.open("step_one.txt", "a") << line
    elsif (line =~ /Beginning step #1 / .. line =~ /Beginning step #2 /) && line !~ /Beginning step #2 /
      File.open("step_one.txt", "a") << line
    else
      nil
    end
  end
end

def s2
  File.readlines(@log_file).each do |line|
    if line.match /Recording dut_serial_number/
      File.open("step_two.txt", "a") << line
    elsif (line =~ /Beginning step #2 / .. line =~ /Beginning step #3 /) && line !~ /Beginning step #3 /
      File.open("step_two.txt", "a") << line
    else
      nil
    end
  end
end

目标是通过接受命令行输入,如上所述对每个步骤进行排序,如下所示:

command_line = ARGV[0..1]

if command_line = "--step" + "1"
  s1
elsif command_line = "--step" + "2"
  s2
else
  nil
end

1 个答案:

答案 0 :(得分:1)

由于你的两个例程正在做同样的事情,所以抽象一个只为你想做的事情带一个参数的函数应该很容易。我还建议使用OptionParser而不是手动管理ARGV。

在我看来,你可以这样做:

log_files = {1 => "step_one.txt", 2 => "step_two.txt"}

def read_log(step) #step is an integer
  File.readlines(@log_file).each do |line|
    if line.match /Recording dut_serial_number/
      File.open(log_files[step], "a") << line
    elsif (line =~ /Beginning step ##{step} / .. line =~ /Beginning step ##{step} /) && line !~ /Beginning step ##{step} /
      File.open(log_files[step], "a") << line
    else
      nil
    end
  end
end

根据您的需要,这可能不起作用,但它可能会让您走上正确的轨道。