2
|
1 /*
|
|
2 Last Change: 2021-05-29 Sat 10:07:37.
|
|
3 */
|
0
|
4 package main
|
|
5
|
|
6 import (
|
2
|
7 _ "embed"
|
|
8
|
0
|
9 "encoding/csv"
|
|
10 "encoding/json"
|
|
11 "fmt"
|
|
12 "io/ioutil"
|
|
13 "log"
|
|
14 "os"
|
|
15 "sort"
|
|
16 "strings"
|
|
17 "time"
|
|
18
|
|
19 "golang.org/x/text/encoding/japanese"
|
|
20 "golang.org/x/text/transform"
|
|
21 )
|
|
22
|
2
|
23 //go:embed porori.go
|
|
24 var go_source string
|
|
25
|
0
|
26 const jsonfile = "porori.json"
|
|
27
|
|
28 type Sinsei struct {
|
|
29 No string
|
|
30 Name string
|
|
31 Ymd string
|
|
32 Kbn string
|
|
33 Ccn string
|
|
34 Bgn string
|
|
35 End string
|
|
36 Term string
|
2
|
37 Kaigo string
|
0
|
38 }
|
|
39
|
|
40 func (s Sinsei) String() string {
|
2
|
41 return strings.Join([]string{s.No, s.Name, s.Ymd, s.Kbn, s.Kaigo, s.Bgn, s.End, s.Term, s.Ccn}, ",")
|
0
|
42 }
|
|
43
|
|
44 func (s Sinsei) TransDate (ymd string) (time.Time, string) {
|
|
45 zero := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC)
|
|
46 if !strings.HasPrefix(ymd, "20") {
|
|
47 return zero, "" // it's dummy
|
|
48 }
|
|
49 t, _ := time.Parse("20060102", ymd)
|
|
50 return t, t.Format(" 2006-01-02")
|
|
51 }
|
|
52
|
|
53 func (s Sinsei) CountMonth(bgn, end time.Time) int {
|
|
54 if bgn.IsZero() {
|
|
55 return 0
|
|
56 }
|
|
57
|
|
58 m := (end.Year() * 12 + int(end.Month())) - (bgn.Year() * 12 + int(bgn.Month()))
|
|
59 if bgn.Day() == 1 {
|
|
60 m++
|
|
61 }
|
|
62 return m
|
|
63 }
|
|
64
|
|
65 func (s *Sinsei) ChangeExpression() {
|
|
66 s.No = "=\"" + strings.TrimSpace(s.No) + "\""
|
|
67
|
|
68 switch s.Kbn {
|
|
69 case "01":
|
|
70 s.Kbn = "新規"
|
|
71 case "02":
|
|
72 s.Kbn = "更新"
|
|
73 case "10":
|
|
74 s.Kbn = "支介"
|
|
75 case "05":
|
|
76 s.Kbn = "区変"
|
|
77 case "03":
|
|
78 s.Kbn = "転入"
|
|
79 case "09":
|
|
80 s.Kbn = "証交"
|
|
81 }
|
|
82 s.Kbn, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kbn)
|
|
83
|
|
84 var bgn, end time.Time
|
|
85 _, s.Ymd = s.TransDate(s.Ymd)
|
|
86 _, s.Ccn = s.TransDate(s.Ccn)
|
|
87 bgn, s.Bgn = s.TransDate(s.Bgn)
|
|
88 end, s.End = s.TransDate(s.End)
|
|
89
|
|
90 s.Term = fmt.Sprintf("%d", s.CountMonth(bgn, end))
|
2
|
91
|
|
92 s.Kaigo = strings.TrimSpace(s.Kaigo)
|
|
93 switch s.Kaigo {
|
|
94 case "21":
|
|
95 s.Kaigo = "介1"
|
|
96 case "22":
|
|
97 s.Kaigo = "介2"
|
|
98 case "23":
|
|
99 s.Kaigo = "介3"
|
|
100 case "24":
|
|
101 s.Kaigo = "介4"
|
|
102 case "25":
|
|
103 s.Kaigo = "介5"
|
|
104 case "12":
|
|
105 s.Kaigo = "支1"
|
|
106 case "13":
|
|
107 s.Kaigo = "支2"
|
|
108 case "01":
|
|
109 s.Kaigo = ""
|
|
110 }
|
|
111 s.Kaigo, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kaigo)
|
0
|
112 }
|
|
113
|
|
114 func main() {
|
|
115
|
|
116 if len(os.Args) != 2 {
|
2
|
117 //fmt.Fprint(os.Stderr, "bat input.")
|
|
118 fmt.Fprint(os.Stderr, go_source)
|
0
|
119 os.Exit(1)
|
|
120 }
|
|
121
|
|
122 // Filter Setting
|
|
123 type YF struct {
|
|
124 From string
|
|
125 To string
|
|
126 }
|
|
127 var yf YF
|
|
128
|
|
129 content, err := ioutil.ReadFile(jsonfile)
|
|
130 if err != nil {
|
|
131 log.Fatal(err)
|
|
132 }
|
|
133 if err := json.Unmarshal(content, &yf); err != nil {
|
|
134 log.Fatal(err)
|
|
135 }
|
|
136
|
|
137 // Read CSV
|
|
138 content, err = ioutil.ReadFile(os.Args[1])
|
|
139 if err != nil {
|
|
140 log.Fatal(err)
|
|
141 }
|
|
142
|
|
143 r := csv.NewReader(strings.NewReader(string(content)))
|
|
144
|
2
|
145 records, err := r.ReadAll() // sorted by Ymd (on MS-Access Query)
|
0
|
146 if err != nil {
|
|
147 log.Fatal(err)
|
|
148 }
|
|
149
|
|
150 // Main Proccess
|
|
151 var sinsei []Sinsei
|
2
|
152 var seen = make(map[string]bool)
|
0
|
153
|
|
154 for _, record := range records {
|
|
155 if record[4] < yf.From || record[4] > yf.To {
|
|
156 continue
|
|
157 }
|
|
158
|
|
159 ss := Sinsei{
|
|
160 No: record[0],
|
|
161 Name: record[1],
|
|
162 Ymd: record[2],
|
|
163 Kbn: record[3],
|
|
164 Ccn: record[4],
|
|
165 Bgn: record[5],
|
|
166 End: record[6],
|
2
|
167 Kaigo: record[7],
|
0
|
168 }
|
2
|
169 sinsei = append(sinsei, ss)
|
|
170
|
|
171 if record[3] == "02" {
|
|
172 seen[record[0]] = true
|
|
173 }
|
|
174 }
|
|
175
|
|
176 var prev_sinsei []Sinsei
|
|
177 for _, record := range records {
|
|
178 if record[4] < yf.From && seen[record[0]] {
|
0
|
179
|
2
|
180 ss := Sinsei{
|
|
181 No: record[0],
|
|
182 Name: record[1],
|
|
183 Ymd: record[2],
|
|
184 Kbn: record[3],
|
|
185 Ccn: record[4],
|
|
186 Bgn: record[5],
|
|
187 End: record[6],
|
|
188 Kaigo: record[7],
|
|
189 }
|
|
190 prev_sinsei = append(prev_sinsei, ss)
|
|
191 }
|
0
|
192 }
|
|
193
|
|
194 sort.Slice(sinsei, func(i, j int) bool {
|
|
195 return sinsei[i].Ymd < sinsei[j].Ymd
|
|
196 })
|
|
197
|
|
198 // Output
|
2
|
199 header := strings.Join([]string{"被保番", "氏名", "申請日", "区分", "要介護度", "開始日", "終了日", "期間", "審査会"}, ",")
|
0
|
200 header, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), header)
|
|
201 fmt.Println(header)
|
|
202
|
|
203 for _, s := range sinsei {
|
2
|
204 var renew string
|
|
205 for _, p := range prev_sinsei {
|
|
206 if s.No == p.No {
|
|
207 p.ChangeExpression()
|
|
208 renew = strings.Join(strings.Split(p.String(), ",")[3:], ",")
|
|
209 }
|
|
210 }
|
|
211 s.ChangeExpression()
|
|
212 fmt.Println(s, ",", renew)
|
0
|
213 }
|
|
214 }
|
|
215
|