解析.log文件并在Excel中编写

时间:2017-03-14 11:20:13

标签: ruby parsing

帮助请执行以下内容: 目录中有很多.log文件,它们需要在Excel表中只读取并显示所需的行,即:

Blade  11
    Model: ProLiant BL460c Gen9
    Manufacturer: HP
    Serial Number: XXXXXXXXX
    Part Number: 727021-B21
    Spare Part Number: 820254-001
    Mezz 1
        Model: HP QMH2672 16Gb FC HBA for BladeSystem c-Class
        Manufacturer: QLogic
        Serial Number: MY56140NML
        PCA Serial Number: MY56140NML
        Part Number: 710608-B21
        Spare Part Number: 711305-001
        Product Ver: 
    Adaptive Fabric Adapter 1
        Model: HP FlexFabric 10Gb 2-port 536FLB Adapter
        Manufacturer: HP
        Serial Number: 7C453705WV
        PCA Serial Number: 7C453705WV
        Part Number: 766490-B21
        Spare Part Number: 768080-001
        Product Ver: 00

有必要在Excel' Blade':

中显示一个表格
Blade  | Model | Manufacturer | Serial Number | Part Number | Spare Part Number
11      ProLiant     HP          CZJ42800G4      XXXXXXXXX    820254-001

12      ProLiant     HP          CZJ42800G5      XXXXXXXXX    820254-002

服务器有Ruby,PHP,Perl。 还有sed和awk的选项吗?

好的我尝试以这种方式实现,但我不理解操作的算法:

 require 'find'
 require 'spreadsheet'

 dirs = []
 filelog = []

workbook  = Spreadsheet::Workbook.new
    heading = Spreadsheet::Format.new(:weight => :bold, :size =>10, :border => :thin, :align => :merge, :pattern_fg_color => :green, :pattern => 1)
    normal  = Spreadsheet::Format.new(size: 10)

    worksheet = workbook.create_worksheet name: 'Blade_name'
    heading_row = worksheet.row(0)
    heading_row.set_format(0, heading)
    heading_row.set_format(1, heading)
    heading_row.set_format(2, heading)
    heading_row.set_format(3, heading)
    heading_row.set_format(4, heading)


    worksheet.row(0).concat(['Blade name', 'Model', 'Manufacturer', 'Part Number', 'Spare Part Number'])
    worksheet.column(0).width=70
    worksheet.column(1).width=19
    worksheet.column(2).width=35
    worksheet.column(3).width=19
    worksheet.column(4).width=15


 # Find.find("/home/web/projects/get_log") do |f|
 #   if FileTest.directory?(f)
 #     dirs.push(f)

 #   else
 #     filelog.push(f)

    #   $stderr = File.open(filelog, "a+")
 #    end
 #  end


$stderr = File.open('1.log', "a+")
match = line.match('Blade')
if match.nil?

else
  @results << convert_to_hash(match)
  puts @results
end

如何计算每一行并与Blade比较,我不知道=( 或者通过正则表达式?

1 个答案:

答案 0 :(得分:0)

tags = %w|Blade Model:
          Manufacturer:
          Serial\ Number:
          Part\ Number:
          Spare\ Part\ Number:|.map { |t| ".*?#{t}\s+(.*)\n" }.join
input.scan(%r|#{tags}|)
#⇒ [
#  [0] [
#    [0] "11",
#    [1] "ProLiant BL460c Gen9",
#    [2] "HP",
#    [3] "CZJ42800G5",
#    [4] "710608-B21",
#    [5] "820254-001"
#  ],
#  [1] [
#    [0] "12",
#    [1] "ProLiant BL460c Gen9",
#    [2] "HP",
#    [3] "CZJ42800G5",
#    [4] "727021-B21",
#    [5] "820254-002"
#  ]
# ]

现在只需使用生成的数组构建CSV / XLS。