Mercurial > mercurial > hgweb_golang.cgi
view src/kaigo/superFC/fc_tmpl.go @ 65:0369656be06c default tip
many changes.
author | pyon@macmini |
---|---|
date | Fri, 20 May 2022 06:30:34 +0900 |
parents | |
children |
line wrap: on
line source
/* fcgo.go: Fucho de Go Last Change: 2021-06-15 Tue 18:30:10. */ package main /* #cgo LDFLAGS: -L. -lxdwapi -static ##### C_SOURCE ##### */ import "C" import ( _ "embed" "encoding/csv" "flag" "fmt" "io" "log" "os" "regexp" "sort" "strings" "time" "golang.org/x/text/encoding/japanese" "golang.org/x/text/transform" ) //go:embed fcgo.go var go_source string type Data struct { Hno string Page string } func (d *Data) ToCsv() string { s := []string{d.Hno, d.Page} return strings.Join(s, ",") } var ( ver = "0.2" dump bool pver bool clean bool skip bool all bool debug bool xdwfile string txtfile = "fctmp_txt.txt" infofile = "fctmp_info.csv" orderfile = "sort.list" // input pagefile = "fctmp_page.txt" output = "output.xdw" ) func init() { /* INITIALIZE FLAGS */ flag.BoolVar(&pver, "v", false, "print version") flag.BoolVar(&dump, "s", false, "dump source") flag.BoolVar(&all, "a", false, "output all page (default: matched page)") flag.BoolVar(&clean, "c", false, "clean temporary files & exit") flag.BoolVar(&skip, "e", false, "use existed files") flag.BoolVar(&debug, "d", false, "debug mode") flag.StringVar(&xdwfile, "i", "fc.xdw", "target xdw file") } func main() { flag.Parse() if pver { fmt.Printf("fcgo [ver %s]\n", ver) os.Exit(0) } if dump { fmt.Println(go_source) os.Exit(0) } /* PRINT HEADER */ fmt.Println("===================================================") fmt.Println(" 普徴のみならず納通なら被保番でソートできるかも... ") fmt.Printf(" - fcgo [ver %s] -\n", ver) fmt.Println("===================================================\n") print_time("now") fmt.Println("[0] start ...") /* CLEAN TEMPORARY DIRECTORY */ os.Remove(output) if !skip { clean_full() } if clean { os.Exit(0) } print_time("check done") fmt.Println("[1] extract ...") if !skip { C.xdw2txt(C.CString(xdwfile), C.CString(txtfile)) } print_time("extract done.") c := make(chan int) fmt.Println("[2] split ... (run background)") go func() { if !skip { C.xdwsplit1(C.CString(xdwfile)) } print_time("split done.") c <- 1 }() fmt.Println("[3] analize ...") data_hash, err := analize(txtfile, infofile) if err != nil { log.Fatal(err) } print_time("analize done.") debug_print(debug, fmt.Sprintf("len = %d", len(data_hash))) fmt.Println("[4] read order ...") h_order, n, err := read_order(orderfile) if err != nil { log.Fatal(err) } print_time("read order done.") debug_print(debug, fmt.Sprintf("len = %d / %d", len(h_order), n)) fmt.Println("[5] make_list ...") n, err = make_list(h_order, data_hash, pagefile, all) if err != nil { log.Fatal(err) } print_time("make list done.") debug_print(debug, fmt.Sprintf("order = %d", n)) <-c fmt.Println("[6] merge ...") clean_mini() C.xdwmerge(C.CString(pagefile), C.CString(output)) print_time("merge done.") clean_mini() fmt.Println("[7] page ...") C.xdwaddpage(C.CString(output), C.int(1)) print_time("page done.") if !debug { fmt.Println("[8] clean ...") clean_full() print_time("clean done.") } } func analize(txtfile, infofile string) (map[string]Data, error) { hash := make(map[string]Data) c, err := os.ReadFile(txtfile) if err != nil { return hash, err } r := strings.NewReader(string(c)) tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) b, err := io.ReadAll(tr) if err != nil { return hash, err } regHno := regexp.MustCompile(`0[1238]0[0-9]{7}`) var csv string buf := strings.Split(string(b), "期別保険料額") for p, v := range buf[:len(buf)-1] { s := zen2han(v) hno := regHno.FindString(s) page := fmt.Sprintf("%05d", p + 1) data := Data { Hno: hno, Page: page, } hash[hno] = data csv += data.ToCsv() + "\n" } if err := os.WriteFile(infofile, []byte(csv), 0644); err != nil { return hash, err } return hash, nil; } func zen2han(s string) (string) { s = strings.ReplaceAll(s, "0", "0") s = strings.ReplaceAll(s, "1", "1") s = strings.ReplaceAll(s, "2", "2") s = strings.ReplaceAll(s, "3", "3") s = strings.ReplaceAll(s, "4", "4") s = strings.ReplaceAll(s, "5", "5") s = strings.ReplaceAll(s, "6", "6") s = strings.ReplaceAll(s, "7", "7") s = strings.ReplaceAll(s, "8", "8") return strings.ReplaceAll(s, "9", "9") } func read_order(csvfile string) ([]string, int, error) { var order []string c, err := os.ReadFile(csvfile) if err != nil { return order, -1, err } r := strings.NewReader(string(c)) tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) b, err := io.ReadAll(tr) if err != nil { return order, -1, err } n := 0 cr := csv.NewReader(strings.NewReader(string(b))) for { record, err := cr.Read() if err == io.EOF { break } if err != nil { return order, n, err } s := zen2han(record[0]) if strings.HasPrefix(s, "0") { order = append(order, s) } n++ } return order, n, nil } func make_list(h_order []string, hash map[string]Data, pagefile string, all bool) (int, error) { var n int var list []string done := make(map[string]bool) for _, h := range h_order { if _, ok := done[h]; !ok { if data, ok := hash[h]; ok { list = append(list, data.Page) done[h] = true n++ } } } if all { var p []string for h, data := range hash { if !done[h] { p = append(p, data.Page) } } sort.Strings(p) list = append(list, p...) } if err := write_pagefile(pagefile, list); err != nil { return n, err } return n, nil } func write_pagefile(file string, list []string) error { f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE, 0755) if err != nil { return err } for _, p := range list { fmt.Fprintf(f, "fctmp_%s.xdw\n", p) } if err := f.Close(); err != nil { return err } return nil } func print_time(msg string) { now := time.Now() fmt.Printf("\t%v # %s\n", now, msg) } func debug_print(debug bool, msg string) { if debug { fmt.Printf("\t%s\n", msg) } } func clean_full() error { return clean_file("fctmp_") } func clean_mini() error { return clean_file("fctmp_b") } func clean_file(prefix string) error { files, err := os.ReadDir(".") if err != nil { return err } for _, file := range files { if strings.HasPrefix(file.Name(), prefix) { os.Remove(file.Name()) } } return err }