Mercurial > mercurial > hgweb_golang.cgi
diff src/kaigo/fwgo/fw_tmpl.go @ 57:05f3d51ad966
add fwgo.
author | pyon@macmini |
---|---|
date | Wed, 15 Jul 2020 18:18:24 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/kaigo/fwgo/fw_tmpl.go Wed Jul 15 18:18:24 2020 +0900 @@ -0,0 +1,330 @@ +/* + fwgo.go: Futan-Wariai de Go + + Last Change: 2020-07-14 火 15:04:09. +*/ +package main + +/* +#cgo LDFLAGS: -L. -lxdwapi -static +##### C_SOURCE ##### +*/ +import "C" + +import ( + "encoding/csv" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "regexp" + "strings" + "time" + + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/transform" +) + +type Data struct { + Hno string + Page string + Zip string + SendTo string +} + +func (d *Data) ToCsv() string { + s := []string{d.Hno, d.Page, d.Zip, d.SendTo} + return strings.Join(s, ",") +} + +var ( + ver = "0.1" + + clean bool + skip bool + debug bool + xdwfile string + + txtfile = "fwtmp_txt.txt" + infofile = "fwtmp_info.csv" + orderfile = "order.csv" // input + pagefile1 = "fwtmp_page1.txt" // send to sisetsu + pagefile2 = "fwtmp_page2.txt" // send to home + output1 = "output1.xdw" + output2 = "output2.xdw" +) + +func init() { + /* INITIALIZE FLAGS */ + 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", "KBPV016G.xdw", "target xdw file") +} + +func main() { + flag.Parse() + + /* PRINT HEADER */ + fmt.Println("=================================================") + fmt.Println(" 負担割合証を... ") + fmt.Printf(" - fwgo [ver %s] -\n", ver) + fmt.Println("=================================================\n") + print_time("now") + fmt.Println("[0] start ...") + + /* CLEAN TEMPORARY DIRECTORY */ + os.Remove(output1) + os.Remove(output2) + 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, m, l, err := make_list(h_order, data_hash, pagefile1, pagefile2) + if err != nil { + log.Fatal(err) + } + print_time("make list done.") + debug_print(debug, fmt.Sprintf("order, kunai, kugai = %d, %d, %d", n, m, l)) + + <-c + + fmt.Println("[6] merge ...") + clean_mini() + C.xdwmerge(C.CString(pagefile1), C.CString(output1)) + print_time("merge 1/2 done.") + clean_mini() + C.xdwmerge(C.CString(pagefile2), C.CString(output2)) + print_time("merge 2/2 done.") + + fmt.Println("[7] page ...") + C.xdwaddpage(C.CString(output1), C.int(1), C.int(0)) + print_time("page 1/2 done.") + C.xdwaddpage(C.CString(output2), C.int(n + 1), C.int(1)) + print_time("page 2/2 done.") + + if !debug { + fmt.Println("[9] clean ...") + clean_full() + print_time("clean done.") + } +} + +func analize(txtfile, infofile string) (map[string]Data, error) { + hash := make(map[string]Data) + + c, err := ioutil.ReadFile(txtfile) + if err != nil { + return hash, err + } + r := strings.NewReader(string(c)) + tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) + b, err := ioutil.ReadAll(tr) + if err != nil { + return hash, err + } + + regHid := regexp.MustCompile(`05[0-9]{4}0[1238][0-9]{8}`) + regZip := regexp.MustCompile(`[0123456789]{3}-[0123456789]{4}`) + + var csv string + + buf := strings.Split(string(b), "生年月日年月日") + for p, v := range buf[:len(buf)-1] { + hid := regHid.FindString(v) + hno := hid[6:16] + + zips := regZip.FindAllString(v, -1) + if len(zips) != 2 { + fmt.Println("warnig:", hno, "have not 2 zip-pattern") + } + + s := strings.Split(v, zips[1]) + s = strings.Split(s[len(s)-1], " 様 ") + send := strings.ReplaceAll(s[0], " ", "") + + page := fmt.Sprintf("%05d", p + 1) + + data := Data { + Hno: hno, + Page: page, + Zip: zips[1], + SendTo: send, + } + hash[hno] = data + + csv += data.ToCsv() + "\n" + } + + if err := ioutil.WriteFile(infofile, []byte(csv), 0644); err != nil { + return hash, err + } + return hash, nil; +} + +func read_order(csvfile string) ([]string, int, error) { + var order []string + + c, err := ioutil.ReadFile(csvfile) + if err != nil { + return order, -1, err + } + r := strings.NewReader(string(c)) + tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) + b, err := ioutil.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 + } + + if strings.HasPrefix(record[0], "0") { + order = append(order, record[0]) + } + n++ + } + return order, n, nil +} + +func make_list(h_order []string, hash map[string]Data, pagefile1, pagefile2 string) (int, int, int, error) { + var n, m, l int + var list1, list2 []string + done := make(map[string]bool) + + for _, h := range h_order { + if _, ok := done[h]; !ok { + if data, ok := hash[h]; ok { + list1 = append(list1, data.Page) + done[h] = true + n++ + } + } + } + + for _, z := range []string{"014-00", "014-01", "014-08", "014-1413"} { + for _, data := range hash { + h := data.Hno + if _, ok := done[h]; !ok { + if strings.HasPrefix(data.Zip, z) { + list2 = append(list2, data.Page) + done[h] = true + m++ + } + } + } + } + + for _, data := range hash { + h := data.Hno + if _, ok := done[h]; !ok { + list2 = append(list2, data.Page) + done[h] = true + l++ + } + } + + if err := write_pagefile(pagefile1, list1); err != nil { + return n, m, l, err + } + if err := write_pagefile(pagefile2, list2); err != nil { + return n, m, l, err + } + return n, m, l, 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, "fwtmp_%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("fwtmp_") +} + +func clean_mini() error { + return clean_file("fwtmp_b") +} + +func clean_file(prefix string) error { + files, err := ioutil.ReadDir(".") + if err != nil { + return err + } + + for _, file := range files { + if strings.HasPrefix(file.Name(), prefix) { + os.Remove(file.Name()) + continue + } + } + return err +} +