diff src/kaigo/Porori/src2/porori.go @ 41:34a474fb83c3

add perori/porori/nk.
author pyon@macmini
date Wed, 04 Mar 2020 23:46:59 +0900
parents
children 0369656be06c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/kaigo/Porori/src2/porori.go	Wed Mar 04 23:46:59 2020 +0900
@@ -0,0 +1,154 @@
+package main
+
+import (
+	"encoding/csv"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"os"
+	"sort"
+	"strings"
+	"time"
+
+	"golang.org/x/text/encoding/japanese"
+	"golang.org/x/text/transform"
+)
+
+const jsonfile = "porori.json"
+
+type Sinsei struct {
+	No string
+	Name string
+	Ymd string
+	Kbn string
+	Ccn string
+	Bgn string
+	End string
+	Term string
+}
+
+func (s Sinsei) String() string {
+	return strings.Join([]string{s.No, s.Name, s.Ymd, s.Kbn, s.Bgn, s.End, s.Term, s.Ccn}, ",")
+}
+
+func (s Sinsei) TransDate (ymd string) (time.Time, string) {
+	zero := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC)
+	if !strings.HasPrefix(ymd, "20") {
+		return zero, ""	// it's dummy
+	}
+	t, _ := time.Parse("20060102", ymd)
+	return t, t.Format(" 2006-01-02")
+}
+
+func (s Sinsei) CountMonth(bgn, end time.Time) int {
+	if bgn.IsZero() {
+		return 0
+	}
+
+	m := (end.Year() * 12 + int(end.Month())) - (bgn.Year() * 12 + int(bgn.Month()))
+	if bgn.Day() == 1 {
+		m++
+	}
+	return m
+}
+
+func (s *Sinsei) ChangeExpression() {
+	s.No = "=\"" + strings.TrimSpace(s.No) + "\""
+
+	switch s.Kbn {
+	case "01":
+		s.Kbn = "新規"
+	case "02":
+		s.Kbn = "更新"
+	case "10":
+		s.Kbn = "支介"
+	case "05":
+		s.Kbn = "区変"
+	case "03":
+		s.Kbn = "転入"
+	case "09":
+		s.Kbn = "証交"
+	}
+	s.Kbn, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kbn)
+
+	var bgn, end time.Time
+	_, s.Ymd = s.TransDate(s.Ymd)
+	_, s.Ccn = s.TransDate(s.Ccn)
+	bgn, s.Bgn = s.TransDate(s.Bgn)
+	end, s.End = s.TransDate(s.End)
+
+	s.Term = fmt.Sprintf("%d", s.CountMonth(bgn, end))
+}
+
+func main() {
+
+	if len(os.Args) != 2 {
+		fmt.Fprint(os.Stderr, "bat input.")
+		os.Exit(1)
+	}
+
+	// Filter Setting
+	type YF struct {
+		From string
+		To string
+	}
+	var yf YF
+
+	content, err := ioutil.ReadFile(jsonfile)
+	if err != nil {
+		log.Fatal(err)
+	}
+	if err := json.Unmarshal(content, &yf); err != nil {
+		log.Fatal(err)
+	}
+
+	// Read CSV
+	content, err = ioutil.ReadFile(os.Args[1])
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	r := csv.NewReader(strings.NewReader(string(content)))
+
+	records, err := r.ReadAll()
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	// Main Proccess
+	var sinsei []Sinsei
+
+	for _, record := range records {
+		if record[4] < yf.From || record[4] > yf.To {
+			continue
+		}
+
+		ss := Sinsei{
+			No: record[0],
+			Name: record[1],
+			Ymd: record[2],
+			Kbn: record[3],
+			Ccn: record[4],
+			Bgn: record[5],
+			End: record[6],
+		}
+		ss.ChangeExpression()
+
+		sinsei = append(sinsei, ss)
+	}
+
+	sort.Slice(sinsei, func(i, j int) bool {
+		return sinsei[i].Ymd < sinsei[j].Ymd
+	})
+
+	// Output
+	header := strings.Join([]string{"被保番", "氏名", "申請日", "区分", "開始日", "終了日", "期間", "審査会"}, ",")
+	header, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), header)
+	fmt.Println(header)
+
+	for _, s := range sinsei {
+		fmt.Println(s)
+	}
+}
+