package main import ( _ "embed" "encoding/json" "flag" "fmt" "html/template" "io/ioutil" "log" "os" "regexp" "strconv" "strings" ) type ( //Attach 附件 Attach struct { Id int Department string `json:"department"` Href string `json:"attach_href"` Title string `json:"info_title"` Raw string } Attaches []*Attach ) var ( df = flag.String("df", "./data.dat", "datafile 数据文件") of = flag.String("of", "./data.html", "输出的html文件") tpl *template.Template //go:embed tpl.html html string reg, _ = regexp.Compile("(\\d{4}年)") repeart = map[string]int{} ) // readDataFile func readDataFile() Attaches { ret := make(Attaches, 0, 0) bs, err := ioutil.ReadFile(*df) if err != nil { log.Fatal(err) } content := string(bs) index := 1 for _, s := range strings.Split(content, "\n") { if len(s) == 0 { continue } var data string = s if strings.HasPrefix(s, ",") { data = s[1:] } var attach = new(Attach) err = json.Unmarshal([]byte(data), attach) if err == nil { ret = append(ret, attach) attach.Raw = s attach.Id = index index += 1 //TODO 修改标题 attach.Title = rename(attach.Title) } } return ret } // rename func rename(text string) string { if reg.MatchString(text) { m := reg.FindAllString(text, -1) year := findMaxYear(m) text = reg.ReplaceAllString(text, "") ext := "" if strings.Contains(text, ".") { tmp := strings.Split(text, ".") ext = strings.ToLower(tmp[len(tmp)-1]) if ext == "pdf" || ext == "doc" || ext == "docx" || ext == "xls" || ext == "xlsx" || ext == "zip" || ext == "rar" { text = text[:len(text)-4] } } key := fmt.Sprintf("%d_%s", year, text) if v, ok := repeart[key]; ok { repeart[key] = v + 1 return fmt.Sprintf("%s_%d.%s", key, v+1, ext) } else { repeart[key] = 1 return fmt.Sprintf("%s_%d.%s", key, 1, ext) } } return text } // findMaxYear func findMaxYear(src []string) int { year := 2022 for _, v := range src { y, err := strconv.Atoi(v[:4]) if err == nil && y > year { year = y } } return year } // init func init() { flag.Parse() var err error tpl, err = template.New("tpl").Parse(html) if err != nil { log.Fatal(err) } } // main func main() { rs := readDataFile() fo, err := os.Create(*of) if err != nil { log.Fatal(err) } err = tpl.Execute(fo, rs) if err != nil { log.Fatal(err) } fo.Close() }