哈希数组-无类错误



我已经将输入日志数据重组为以下结构,并试图导出为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
in `block (2 levels) in <main>': undefined method `each' for nil:NilClass (NoMethodError)

这意味着错误发生在第34行(2个级别(的块内部。因此,val[:data].each do |k, v|。来自final数组的第一个散列是尚未对:data进行键控的{:server=>"new_US_dof1_new"}

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

最新更新