Mercurial > mercurial > hgweb_golang.cgi
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) + } +} +