Ruby on rails 如何在Ruby中的哈希循环数组中设置标志

Ruby on rails 如何在Ruby中的哈希循环数组中设置标志,ruby-on-rails,ruby,Ruby On Rails,Ruby,我已经处理了一个输入文件,并创建了以下格式的数据结构 final = [ {:server=>"new_US_dof1_new"}, {:name=>"OLAUS51", :data=>{"HAL"=>"6.93817139", "CCN_RESP"=>".035400391", "PA_RESP"=>".032287598", "PE_RESP"=>".000610352"}}, {:name=>"OLAUS10", :data=>{"HA

我已经处理了一个输入文件,并创建了以下格式的数据结构

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"}}]
我已经想出了下面的代码来处理和获得上述格式

final = []
count = -1

output = File.open("input.txt").read
output.each_line do |line|
  line.strip!
  next if line.empty?
  next if line.include?('rows') || line.include?('occ')
  next if ['-','='].include? line[0]
  parts = line.split ' '
   if parts.size == 1 and line.start_with?('new_')
    final[count += 1] = {server: line, data: {}}
    next
  elsif parts.size == 1 and parts = /^(?!.*new_).*$/
    final[count += 1] = {name: line, data: {}}
    next
  end

  parts.each_cons(2) do |key, value|
    final[count][:data][key] = value 
    end
end

p = Axlsx::Package.new
p.workbook.add_worksheet(:name => "Basic") do |sheet|

    style1 = sheet.styles.add_style(:bg_color => "EF0920", :fg_color => "FFFFFF", b:true, :sz => 14, :alignment => { :horizontal=> :center })
    style2 = sheet.styles.add_style(:bg_color => "00FF00", :fg_color => "FFFFFF", b:true, :sz => 12, :alignment => { :horizontal=> :center })
    sheet.add_row ["VM", "NAME", "DATA", "SIZE"], :style => style1

    final.each do |val|
     if val.key?(:server) 
       sheet.add_row [ val[:server], val[:name], "", "" ] , :style =>[style2, nil]
       next
    elsif val.key?(:name)
      sheet.add_row [ "", val[:name], "", "" ]
      val[:data].each do |k, v|
        sheet << ["", "", k, v]
          end       
       end
    end 
end
final=[]
计数=-1
输出=File.open(“input.txt”).read
output.u每行do |行|
行,快走!
下一个if line.empty?
下一个if行。包括?('rows')| |行。包括?('occ'))
下一步如果['-','='],是否包括?第[0]行
零件=行分割“
如果parts.size==1,则以?('new_u'开头)
final[count+=1]={服务器:行,数据:{}
下一个
elsif parts.size==1和parts=/^(?。*新建)*$/
final[count+=1]={name:行,数据:{}
下一个
结束
零件。每个零件(2)都有键、值|
最终[计数][:数据][键]=值
结束
结束
p=Axlsx::Package.new
p、 工作簿.添加工作表(:name=>“Basic”)工作表|
style1=sheet.styles.add_样式(:bg_color=>“EF0920”,:fg_color=>“FFFFFF”,b:true,:sz=>14,:alignment=>{:水平=>:center})
style2=sheet.styles.add_样式(:bg_color=>“00FF00”,:fg_color=>“FFFFFF”,b:true,:sz=>12,:alignment=>{:horizontal=>:center})
sheet.add_行[“VM”、“名称”、“数据”、“大小”],:style=>style1
最终。每个do | val|
如果val.key?(:服务器)
sheet.add_行[val[:server],val[:name],“”,“”],:style=>[style2,nil]
下一个
elsif val.key?(:名称)
sheet.add_行[“”,val[:名称],“”,“”]
val[:数据]。每个do | k,v|

为什么不呢?根据我过去的回答:

final.each_with_object([]) do |val, line|
  # when key :server exist set server's name as first element for line
  # otherwise set empty value to create a blank cell at position 1
  line << (val.key?(:server) ? val[:server] : '') if line.empty?

  # when key :server exist, in the current hash no needed data
  next if val.key?(:server)

  # at this place line look like [server_name/'']
  # so, when no key :server, in each base hash present keys :name and :data
  line << val[:name]

  # line => [server_name, name] for new server
  # line => ['', name] for new properties for the same server

  # for {name: 'some name', data: {}}
  sheet.add_row [*line, '', ''], :style =>[style2, nil] if val[:data].empty?

  val[:data].each do |k, v|
    # add values from data hash
    line << k << v

    # push line to the sheet
    # first iteration for val[:data]
    # line => [server_name/'', name, data_key, data_value]
    # iteration 2+
    # line => ['', '', data_key, data_value]
    sheet.add_row line.clone, :style =>[style2, nil]

    # array line from each_with_object can't be replaced but can be cleaned
    line.clear

    # line => []
    # push two blank values
    line << '' << ''
    # line => ['', '']
    # that line's data will be used for the current loop
  end

  # add a blank line after block :data
  sheet.add_row []

  # line => ['', '']
  # cleaning a line for next hash
  line.clear
  # line => []
end
final.每个带有对象([])的对象都有一行|
#当key:server存在时,将服务器名称设置为行的第一个元素
#否则,设置空值以在位置1处创建空白单元格
同一服务器的新属性的第[“”,名称]行
#对于{name:'some name',数据:{}
sheet.add_行[*行,,'',:style=>[style2,nil]如果val[:data]。是否为空?
val[:数据]。每个do | k,v|
#从数据散列中添加值
行['',,数据键,数据值]
sheet.add_row line.clone,:style=>[style2,nil]
#无法替换每个带有\u对象的\u的数组线,但可以清除
行,没问题
#行=>[]
#按下两个空白值

请不要在问题中使用图片。只使用文本。@tukan:当然,注意到了。谢谢谢谢。。但不是服务器值,而是它的打印是真是假,并且存在格式不匹配<代码>服务器名称数据大小TRUE FALSE INDQA51 PAL 6.93817139 YCC_OWNER 0.035400391 PA_OWNER 0.032287598 PE_OWNER 0.000610352 FALSE INDQA10 PAL 52.7266846 CFG_OWNER 15.9489746依此类推
如问题所示,具有空值,如
{:name=>“IISCR70”、:data=>{}}{:name=>“IQDV500”、:data=>{}}
。因此有可能吗?抱歉,如果需要,我知道格式不正确,我可以将最终输出发送给您。非常感谢您在这里花费的时间。我尝试了您的最新编辑,以防服务器数据格式不匹配。。有没有可能它的值为零<代码>服务器名称数据大小新建\u US\u dof1\u新建INDQA51 PAL 6.93817139。。。。。。新的IBDVHAL HAL 1.81048584。。。。。。等等..
@Goku,你能检测出产生错误的散列吗?这可能与
[style2,nil]
有关吗?我试图删除[style2,nil]?但服务器值的格式仍然不正确
final.each_with_object([]) do |val, line|
  # when key :server exist set server's name as first element for line
  # otherwise set empty value to create a blank cell at position 1
  line << (val.key?(:server) ? val[:server] : '') if line.empty?

  # when key :server exist, in the current hash no needed data
  next if val.key?(:server)

  # at this place line look like [server_name/'']
  # so, when no key :server, in each base hash present keys :name and :data
  line << val[:name]

  # line => [server_name, name] for new server
  # line => ['', name] for new properties for the same server

  # for {name: 'some name', data: {}}
  sheet.add_row [*line, '', ''], :style =>[style2, nil] if val[:data].empty?

  val[:data].each do |k, v|
    # add values from data hash
    line << k << v

    # push line to the sheet
    # first iteration for val[:data]
    # line => [server_name/'', name, data_key, data_value]
    # iteration 2+
    # line => ['', '', data_key, data_value]
    sheet.add_row line.clone, :style =>[style2, nil]

    # array line from each_with_object can't be replaced but can be cleaned
    line.clear

    # line => []
    # push two blank values
    line << '' << ''
    # line => ['', '']
    # that line's data will be used for the current loop
  end

  # add a blank line after block :data
  sheet.add_row []

  # line => ['', '']
  # cleaning a line for next hash
  line.clear
  # line => []
end