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
+}
+