Mercurial > mercurial > hgweb_golang.cgi
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/kaigo/superFC/fc_tmpl.go Fri May 20 06:30:34 2022 +0900 @@ -0,0 +1,326 @@ +/* + 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 +} +