ZeroKong
文章19
标签16
分类6
使用GO语言实现主机扫描报告自动分类并生成CSV文件

使用GO语言实现主机扫描报告自动分类并生成CSV文件

约1.5k字 预计需要7分钟

使用GO语言实现主机扫描报告自动分类并生成CSV文件

使用GO语言实现主机扫描报告自动分类并生成CSV文件

起因

因客户要求制作一个能够针对主机扫描报告进行自动分类的程序。于是决定使用一小会的时间用GO语言简单写一个。

代码

JSON资产示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
"date": "2022年9月14日 16:32",
"author": "ZeroKong",
"email": "admin@zerokong.cn",
"itAssets": {
"10.0.0.1": {
"IP地址": "10.0.0.1",
"位置": "机房A",
"部门": "A部门",
"系统名称": "A系统",
"负责人": "张三"
},
"10.0.0.2": {
"IP地址": "10.0.0.2",
"位置": "机房A",
"部门": "A部门",
"系统名称": "A系统",
"负责人": "张三"
},
"10.0.0.3": {
"IP地址": "10.0.0.3",
"位置": "机房A",
"部门": "A部门",
"系统名称": "A系统",
"负责人": "张三"
},
"10.0.0.4": {
"IP地址": "10.0.0.4",
"位置": "机房B",
"部门": "B部门",
"系统名称": "B系统",
"负责人": "李四"
},
"10.0.0.5": {
"IP地址": "10.0.0.5",
"位置": "机房B",
"部门": "B部门",
"系统名称": "B系统",
"负责人": "李四"
},
"10.0.0.6": {
"IP地址": "10.0.0.6",
"位置": "机房B",
"部门": "B部门",
"系统名称": "B系统",
"负责人": "李四"
}
}
}

GO语言代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// ************************
// ************************
// 日期:2022年9月14日
// 作者:ZeroKong/东方零食
// ************************
// ************************
package main

import (
"container/list"
"encoding/csv"
"encoding/json"
"fmt"
"io/ioutil"
"os"
)

// 结构体
type Data struct { //带结构标签,反引号来包围字符串
Date string `json:"date"`
Author string `json:"author"`
Email string `json:"email"`
ItAssets map[string]ItAssets `json:"itAssets"`
}

type ItAssets struct {
// 位置、部门、负责人、IP地址、系统名称、备注、整改方案字段名称
Address string `json:"位置"`
Department string `json:"部门"`
Leader string `json:"负责人"`
IPAddress string `json:"IP地址"`
System string `json:"系统名称"`
Remark string `json:"备注"`
Plan string `json:"整改方案"`
}

func main() {
// 打开文件
jsonFile, err := os.Open("data.json")
// 如果打开失败,则终止程序
if err != nil {
// 输出错误信息
fmt.Println("error opening json file")
return
}

// 关闭文件
defer func(jsonFile *os.File) {
// 如果关闭失败,则终止程序
err := jsonFile.Close()
if err != nil {
// 输出错误信息
fmt.Println("error closing json file")
}
}(jsonFile)

// 读取文件内容
jsonData, err := ioutil.ReadAll(jsonFile)
// 如果读取失败,则终止程序
if err != nil {
// 输出错误信息
fmt.Println("error reading json file")
return
}

// 将json数据解析到结构体
var data Data
err = json.Unmarshal(jsonData, &data)
if err != nil {
// 输出错误信息
fmt.Println("error unmarshalling json data")
return
}

var cvslist list.List
//遍历扫描报告目录下的文件
//此处需要优化,不判断文件夹
files, _ := os.ReadDir("./扫描报告")
for _, file := range files {
//去除".doc"字符
fileName := file.Name()
fileName = fileName[:len(fileName)-4]
// map判断key是否存在
if _, ok := data.ItAssets[fileName]; ok {
// 存在
var report []byte
report, err = json.Marshal(data.ItAssets[fileName])
cvslist.PushBack(string(report))
fmt.Println(string(report))
//判断部门\负责人\系统名称目录是否存在不存在则创建目录
if _, err := os.Stat("./扫描报告/" + data.ItAssets[fileName].Department + "/" + data.ItAssets[fileName].Leader + "/" + data.ItAssets[fileName].System); os.IsNotExist(err) {
err := os.MkdirAll("./扫描报告/"+data.ItAssets[fileName].Department+"/"+data.ItAssets[fileName].Leader+"/"+data.ItAssets[fileName].System, os.ModePerm)
if err != nil {
return
}
}
//移动file.Name()到指定目录
err = os.Rename("./扫描报告/"+file.Name(), "./扫描报告/"+string(data.ItAssets[fileName].Department)+"/"+string(data.ItAssets[fileName].Leader)+"/"+string(data.ItAssets[fileName].System)+"/"+file.Name())
if err != nil {
fmt.Println(err)
}
} else {
// 不存在
//因为在mac下编译有个隐藏文件先忽略,后续使用执行文件后删除判断即可
if fileName == ".DS_S" {
fmt.Println("文件名为.DS_S")
} else {
fmt.Println(fileName)
//判断部门\负责人\系统名称目录是否存在不存在则创建目录
if _, err := os.Stat("./扫描报告/无法核实"); os.IsNotExist(err) {
err := os.MkdirAll("./扫描报告/无法核实", os.ModePerm)
if err != nil {
return
}
}
//移动file.Name()到指定目录
err = os.Rename("./扫描报告/"+file.Name(), "./扫描报告/无法核实/"+file.Name())
if err != nil {
fmt.Println(err)
}
cvslist.PushBack("{\"位置\":\"\",\"部门\":\"\",\"负责人\":\"\",\"IP地址\":\"" + fileName + "\",\"系统名称\":\"\",\"备注\":\"\",\"整改方案\":\"\"}")
}
}
}

//将cvslist每一行json中的位置、部门、负责人、IP地址、系统名称、备注、整改方案写入csv文件
//创建csv文件
csvFile, err := os.Create("./扫描报告.csv")
if err != nil {
fmt.Println(err)
return
}
defer csvFile.Close()

//写入UTF-8 BOM
csvFile.WriteString("\xEF\xBB\xBF")
//写入文件头
csvWriter := csv.NewWriter(csvFile)
csvWriter.Write([]string{"位置", "部门", "负责人", "IP地址", "系统名称", "备注", "整改方案"})
//遍历cvslist
for e := cvslist.Front(); e != nil; e = e.Next() {
var data02 ItAssets
err := json.Unmarshal([]byte(e.Value.(string)), &data02)
if err != nil {
fmt.Println(err)
return
}

csvWriter.Write([]string{data02.Address, data02.Department, data02.Leader, data02.IPAddress, data02.System, data02.Remark, data02.Plan})
}
csvWriter.Flush()

}

后言

代码比较简单先这么写一下,后续在优化就酱紫。

本文作者:ZeroKong
本文链接:https://blog.zerokong.com/20220914-%E4%BD%BF%E7%94%A8GO%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%E4%B8%BB%E6%9C%BA%E6%89%AB%E6%8F%8F%E6%8A%A5%E5%91%8A%E8%87%AA%E5%8A%A8%E5%88%86%E7%B1%BB%E5%B9%B6%E7%94%9F%E6%88%90CSV%E6%96%87%E4%BB%B6/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×