Mercurial > mercurial > hgweb_kaigo.hg.cgi
view Porori/src2/porori.go @ 2:65b8529196d5 draft
Porori: add comment.
author | pyon <pyon@macmini> |
---|---|
date | Sat, 29 May 2021 10:07:57 +0900 |
parents | aaaa401818a1 |
children | bbeb834023e3 |
line wrap: on
line source
/* Last Change: 2021-05-29 Sat 10:07:37. */ package main import ( _ "embed" "encoding/csv" "encoding/json" "fmt" "io/ioutil" "log" "os" "sort" "strings" "time" "golang.org/x/text/encoding/japanese" "golang.org/x/text/transform" ) //go:embed porori.go var go_source string const jsonfile = "porori.json" type Sinsei struct { No string Name string Ymd string Kbn string Ccn string Bgn string End string Term string Kaigo string } func (s Sinsei) String() string { return strings.Join([]string{s.No, s.Name, s.Ymd, s.Kbn, s.Kaigo, 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)) s.Kaigo = strings.TrimSpace(s.Kaigo) switch s.Kaigo { case "21": s.Kaigo = "介1" case "22": s.Kaigo = "介2" case "23": s.Kaigo = "介3" case "24": s.Kaigo = "介4" case "25": s.Kaigo = "介5" case "12": s.Kaigo = "支1" case "13": s.Kaigo = "支2" case "01": s.Kaigo = "" } s.Kaigo, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kaigo) } func main() { if len(os.Args) != 2 { //fmt.Fprint(os.Stderr, "bat input.") fmt.Fprint(os.Stderr, go_source) 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() // sorted by Ymd (on MS-Access Query) if err != nil { log.Fatal(err) } // Main Proccess var sinsei []Sinsei var seen = make(map[string]bool) 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], Kaigo: record[7], } sinsei = append(sinsei, ss) if record[3] == "02" { seen[record[0]] = true } } var prev_sinsei []Sinsei for _, record := range records { if record[4] < yf.From && seen[record[0]] { ss := Sinsei{ No: record[0], Name: record[1], Ymd: record[2], Kbn: record[3], Ccn: record[4], Bgn: record[5], End: record[6], Kaigo: record[7], } prev_sinsei = append(prev_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 { var renew string for _, p := range prev_sinsei { if s.No == p.No { p.ChangeExpression() renew = strings.Join(strings.Split(p.String(), ",")[3:], ",") } } s.ChangeExpression() fmt.Println(s, ",", renew) } }