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