Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 干涸文本解析和ARGV_Ruby_Optimization_Dry - Fatal编程技术网

Ruby 干涸文本解析和ARGV

Ruby 干涸文本解析和ARGV,ruby,optimization,dry,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 d

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

@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

因为您的两个例程正在做相同的事情,所以抽象一个函数应该很容易,它只需要为您想要做的事情获取一个参数。我还建议使用,而不是手动管理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
log_files={1=>“step_one.txt”,2=>“step_two.txt”}
def read_log(步骤)#步骤是一个整数
readlines(@log_File)。每个do|行|
如果线路匹配/记录dut_序列号/

打开(log_files[step],“a”)是不是每个步骤都在做相同的事情,只是针对不同的数据?所有步骤都应该只是解析文本,是的!这在代码中运行得很好,但是您可以为我指出一个方向,使代码可以接受任意数量的步骤吗?例如,目前的步骤是7,但以后可能需要执行更多步骤,因此基本上它可以接受/any/number而不是任意列表。这些步骤是否总是有序的?i、 e.1-7、1-20等
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