代码之家  ›  专栏  ›  技术社区  ›  Goku

哈希数组-零类错误

  •  0
  • Goku  · 技术社区  · 6 年前

    我已将输入日志数据重新组织为下面的结构,并尝试导出为Excel电子表格。在将值推送到excel工作表时,我遇到了下面的问题,我已经检查了所有nil类的数组,但是结果是错误的,我不确定问题在哪里。

    final = [ {:server=>"new_US_dof1_new"}
    {:name=>"OLAUS51", :data=>{"HAL"=>"6.93817139", "CCN_RESP"=>".035400391", "PA_RESP"=>".032287598", "PE_RESP"=>".000610352"}}
    {:name=>"OLAUS10", :data=>{"HAL"=>"52.7266846", "CFG_RESP"=>"15.9489746"}}
    {:name=>"IdofQA03", :data=>{"PA_RESP"=>".096374512"}}
    {:name=>"QEMDB", :data=>{"HAL"=>"22.2698975", "PA_RESP"=>"11.7857666", "CCN_RESP"=>".229125977", "PE_RESP"=>".007202148"}}
    {:name=>"OLAUS64", :data=>{"CCN_RESP"=>".757202148"}}
    {:name=>"IISCR70", :data=>{}}
    {:name=>"IQDV500", :data=>{}}
    {:name=>"OLAUS80", :data=>{"PA_RESP"=>"10.5393066", "HAL"=>"4.73620605", "CCN_RESP"=>".023864746", "PE_RESP"=>".003723145", "OPENREPORTS"=>".001708984", "REPORT_RESP"=>".001281738"}}
    
    {:server=>"new_US_dof2_new"}
    {:name=>"IBDVHAL", :data=>{"HAL"=>"1.81048584", "FM_RESP"=>".001098633"}}
    {:name=>"DEVSITEP", :data=>{"HAL"=>".088012695", "PE_RESP"=>".000610352"}}
    {:name=>"OLAUS87", :data=>{"CFG_RESP"=>"1.57061768", "HAL"=>".47253418", "PA_RESP"=>".011962891", "PE_RESP"=>".007202148"}}
    
    same format for other servers]
    

    错误 以下内容:

    in `block (2 levels) in <main>': undefined method `each' for nil:NilClass (NoMethodError)
            from excel.rb:34:in `each'
            from excel.rb:34:in `block in <main>'
            from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/axlsx-2.0.1/lib/axlsx/workbook/workbook.rb:262:in `add_worksheet'
    

    我试图用以下格式的excel表格来格式化数据

    SERVER               NAME         DATA         GB
    
    new_US_dof1_new"     OLAUS51      HAL          6.93817139
                                      CCN_RESP     .035400391
                                      PA_RESP      .032287598
                                      PE_RESP      000610352
    
                         OLAUS10      HAL           52.7266846
                                      CFG_RESP      15.9489746       
    
    Likewise for other NAME & SERVER
    

    我想出的密码

    require 'csv'
    require 'axlsx'
    
    final = []
    current = -1
    
    str = File.read("combined.log")
    str.each_line do |line|
      line.strip!
      next if line.empty?
      next if line.include?('selected') || line.include?('IN_GB')
      next if ['-','='].include? line[0]
      parts = line.split ' '
       if parts.size == 1 and line.start_with?('size')
        final[current += 1] = {server: line.strip}
        next
      elsif parts.size == 1 and parts = /^(?!.*size_).*$/
        final[current += 1] = {name: line, data: {}}
        next
      end
    
      parts.each_cons(2) do |key, value|
        final[current][:data][key] = value 
        end
    end
    
    #puts final
    
    p = Axlsx::Package.new
    
    wb = p.workbook
    wb.add_worksheet(:name => "Basic") do |sheet|
        sheet.add_row ["SERVER", "NAME", "DATA", "GB]"]
        final.each do |val|
          sheet << [ val[:server], val[:name] ]
          val[:data].each do |k, v|
           sheet << ["", "", k, v]
          end
        end
    end
    
    p.serialize 'server.xlsx'
    

    将日志文件的部分过帐以供参考:

    ---- db name ----
    new_US_dof1_new
    
    OLAUS51
    
    
    RESP                    IN_GB
    ------------------------------ ----------
    HAL                6.93817139
    CCN_RESP               .035400391
    PA_RESP            .032287598
    PE_RESP            .000610352
    
    
    =========================================
    
    
    ---- db name ----
    
    
    OLAUS10
    
    
    RESP                    IN_GB
    ------------------------------ ----------
    HAL                52.7266846
    CFG_RESP               15.9489746
    CCN_RESP               .401794434
    PA_RESP            .346679688
    PE_RESP            .008056641
    
    
    =========================================
    I"m skipping the values for server 1 & proceeding to server 2 values for better readability 
    
    ---- db name ----
    new_US_dof2_new
    
    IBDVHAL
    
    RESP                    IN_GB
    ------------------------------ ----------
    HAL                1.81048584
    FM_RESP           .001098633
    
    =========================================
    
    
    ---- db name ----
    
    DEVSITEP
    
    RESP                    IN_GB
    ------------------------------ ----------
    HAL                088012695
    FM_RESP           .000610352
    
    and so on for other server and values
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Leo    6 年前
    in `block (2 levels) in <main>': undefined method `each' for nil:NilClass (NoMethodError)
    

    这意味着错误发生在第34行(2个级别)的块内。所以, val[:data].each do |k, v| 是的。你的第一份杂烩 final 数组是 {:server=>"new_US_dof1_new"} 没有钥匙 :data 是的。

    final.each_with_object([]) do |val, line|
      if line.empty?
        line << val.key?(:server) ? val[:server] : ''
        next if val.key?(:server)
      end
      line << val[:name]
    
      val[:data].each do |k, v|
        line << k << v
        sheet << line.clone
        line.clear
        line << '' << ''
      end
      line.clear
    end