comparison 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
comparison
equal deleted inserted replaced
40:c6df3bae683e 41:34a474fb83c3
1 package main
2
3 import (
4 "encoding/csv"
5 "encoding/json"
6 "fmt"
7 "io/ioutil"
8 "log"
9 "os"
10 "sort"
11 "strings"
12 "time"
13
14 "golang.org/x/text/encoding/japanese"
15 "golang.org/x/text/transform"
16 )
17
18 const jsonfile = "porori.json"
19
20 type Sinsei struct {
21 No string
22 Name string
23 Ymd string
24 Kbn string
25 Ccn string
26 Bgn string
27 End string
28 Term string
29 }
30
31 func (s Sinsei) String() string {
32 return strings.Join([]string{s.No, s.Name, s.Ymd, s.Kbn, s.Bgn, s.End, s.Term, s.Ccn}, ",")
33 }
34
35 func (s Sinsei) TransDate (ymd string) (time.Time, string) {
36 zero := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC)
37 if !strings.HasPrefix(ymd, "20") {
38 return zero, "" // it's dummy
39 }
40 t, _ := time.Parse("20060102", ymd)
41 return t, t.Format(" 2006-01-02")
42 }
43
44 func (s Sinsei) CountMonth(bgn, end time.Time) int {
45 if bgn.IsZero() {
46 return 0
47 }
48
49 m := (end.Year() * 12 + int(end.Month())) - (bgn.Year() * 12 + int(bgn.Month()))
50 if bgn.Day() == 1 {
51 m++
52 }
53 return m
54 }
55
56 func (s *Sinsei) ChangeExpression() {
57 s.No = "=\"" + strings.TrimSpace(s.No) + "\""
58
59 switch s.Kbn {
60 case "01":
61 s.Kbn = "新規"
62 case "02":
63 s.Kbn = "更新"
64 case "10":
65 s.Kbn = "支介"
66 case "05":
67 s.Kbn = "区変"
68 case "03":
69 s.Kbn = "転入"
70 case "09":
71 s.Kbn = "証交"
72 }
73 s.Kbn, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kbn)
74
75 var bgn, end time.Time
76 _, s.Ymd = s.TransDate(s.Ymd)
77 _, s.Ccn = s.TransDate(s.Ccn)
78 bgn, s.Bgn = s.TransDate(s.Bgn)
79 end, s.End = s.TransDate(s.End)
80
81 s.Term = fmt.Sprintf("%d", s.CountMonth(bgn, end))
82 }
83
84 func main() {
85
86 if len(os.Args) != 2 {
87 fmt.Fprint(os.Stderr, "bat input.")
88 os.Exit(1)
89 }
90
91 // Filter Setting
92 type YF struct {
93 From string
94 To string
95 }
96 var yf YF
97
98 content, err := ioutil.ReadFile(jsonfile)
99 if err != nil {
100 log.Fatal(err)
101 }
102 if err := json.Unmarshal(content, &yf); err != nil {
103 log.Fatal(err)
104 }
105
106 // Read CSV
107 content, err = ioutil.ReadFile(os.Args[1])
108 if err != nil {
109 log.Fatal(err)
110 }
111
112 r := csv.NewReader(strings.NewReader(string(content)))
113
114 records, err := r.ReadAll()
115 if err != nil {
116 log.Fatal(err)
117 }
118
119 // Main Proccess
120 var sinsei []Sinsei
121
122 for _, record := range records {
123 if record[4] < yf.From || record[4] > yf.To {
124 continue
125 }
126
127 ss := Sinsei{
128 No: record[0],
129 Name: record[1],
130 Ymd: record[2],
131 Kbn: record[3],
132 Ccn: record[4],
133 Bgn: record[5],
134 End: record[6],
135 }
136 ss.ChangeExpression()
137
138 sinsei = append(sinsei, ss)
139 }
140
141 sort.Slice(sinsei, func(i, j int) bool {
142 return sinsei[i].Ymd < sinsei[j].Ymd
143 })
144
145 // Output
146 header := strings.Join([]string{"被保番", "氏名", "申請日", "区分", "開始日", "終了日", "期間", "審査会"}, ",")
147 header, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), header)
148 fmt.Println(header)
149
150 for _, s := range sinsei {
151 fmt.Println(s)
152 }
153 }
154