view src/kaigo/Porori/src2/porori.go @ 42:c58172a59534

bug fix.
author pyon@macmini
date Tue, 10 Mar 2020 21:12:29 +0900
parents 34a474fb83c3
children 0369656be06c
line wrap: on
line source

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