Mercurial > mercurial > hgweb_golang.cgi
comparison src/kaigo/Porori/src2/porori.go @ 65:0369656be06c default tip
many changes.
author | pyon@macmini |
---|---|
date | Fri, 20 May 2022 06:30:34 +0900 |
parents | 34a474fb83c3 |
children |
comparison
equal
deleted
inserted
replaced
64:ad5c30ee5cf1 | 65:0369656be06c |
---|---|
1 /* | |
2 Last Change: 2021-09-07 火 14:39:09. | |
3 */ | |
1 package main | 4 package main |
2 | 5 |
3 import ( | 6 import ( |
7 "bufio" | |
4 "encoding/csv" | 8 "encoding/csv" |
5 "encoding/json" | 9 "encoding/json" |
6 "fmt" | 10 "fmt" |
7 "io/ioutil" | |
8 "log" | 11 "log" |
9 "os" | 12 "os" |
10 "sort" | 13 "sort" |
11 "strings" | 14 "strings" |
12 "time" | 15 "time" |
23 Ymd string | 26 Ymd string |
24 Kbn string | 27 Kbn string |
25 Ccn string | 28 Ccn string |
26 Bgn string | 29 Bgn string |
27 End string | 30 End string |
28 Term string | 31 Hist string |
32 ReqI string | |
33 Acc string | |
34 ReqC string | |
35 Visit string | |
36 Remark string | |
29 } | 37 } |
30 | 38 |
31 func (s Sinsei) String() string { | 39 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}, ",") | 40 s.ChangeExpression() |
41 | |
42 var ymd, ccn, bgn, end, reqi, acc, reqc, visit, remark time.Time | |
43 ymd, s.Ymd = s.TransDate(s.Ymd) | |
44 ccn, s.Ccn = s.TransDate(s.Ccn) | |
45 bgn, s.Bgn = s.TransDate(s.Bgn) | |
46 end, s.End = s.TransDate(s.End) | |
47 reqi, s.ReqI = s.TransDate(s.ReqI) | |
48 acc, s.Acc = s.TransDate(s.Acc) | |
49 reqc, s.ReqC = s.TransDate(s.ReqC) | |
50 visit, s.Visit = s.TransDate(s.Visit) | |
51 remark, s.Remark = s.TransDate(s.Remark) | |
52 | |
53 term := fmt.Sprintf("%d", s.CalcTerm(bgn, end)) | |
54 ridays := fmt.Sprintf("%d", s.CountDay(ymd, reqi)) | |
55 adays := fmt.Sprintf("%d", s.CountDay(reqi, acc)) | |
56 rcdays := fmt.Sprintf("%d", s.CountDay(ymd, reqc)) | |
57 vdays := fmt.Sprintf("%d", s.CountDay(reqc, visit)) | |
58 tdays := fmt.Sprintf("%d", s.CountDay(visit, remark)) | |
59 rdays := fmt.Sprintf("%d", s.CountDay(ymd, ccn)) | |
60 return strings.Join([]string{s.No, s.Name, s.Ymd, s.Kbn, s.Bgn, s.End, term, s.Ccn, rdays, s.ReqI, ridays, s.Acc, adays, s.ReqC, rcdays, s.Visit, vdays, s.Remark, tdays}, ",") | |
33 } | 61 } |
34 | 62 |
35 func (s Sinsei) TransDate (ymd string) (time.Time, string) { | 63 func (s Sinsei) TransDate (ymd string) (time.Time, string) { |
36 zero := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC) | 64 zero := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC) |
37 if !strings.HasPrefix(ymd, "20") { | 65 if !strings.HasPrefix(ymd, "20") { |
39 } | 67 } |
40 t, _ := time.Parse("20060102", ymd) | 68 t, _ := time.Parse("20060102", ymd) |
41 return t, t.Format(" 2006-01-02") | 69 return t, t.Format(" 2006-01-02") |
42 } | 70 } |
43 | 71 |
44 func (s Sinsei) CountMonth(bgn, end time.Time) int { | 72 func (s Sinsei) CalcTerm(bgn, end time.Time) int { |
45 if bgn.IsZero() { | 73 if bgn.IsZero() || end.IsZero() { |
46 return 0 | 74 return 0 |
47 } | 75 } |
48 | 76 |
49 m := (end.Year() * 12 + int(end.Month())) - (bgn.Year() * 12 + int(bgn.Month())) | 77 m := (end.Year() * 12 + int(end.Month())) - (bgn.Year() * 12 + int(bgn.Month())) |
50 if bgn.Day() == 1 { | 78 if bgn.Day() == 1 { |
51 m++ | 79 m++ |
52 } | 80 } |
53 return m | 81 return m |
82 } | |
83 | |
84 func (s Sinsei) CountDay(bgn, end time.Time) int { | |
85 if bgn.IsZero() || end.IsZero() { | |
86 return -9999 | |
87 } | |
88 | |
89 if bgn.Year() == end.Year() { | |
90 return end.YearDay() - bgn.YearDay() | |
91 } | |
92 if end.Year() - bgn.Year() == 1 { | |
93 d := 365 - bgn.YearDay() + end.YearDay() | |
94 if bgn.Year() % 4 == 0 { // can use 2001 - 2099 | |
95 d++ | |
96 } | |
97 return d | |
98 } | |
99 | |
100 return -9999 | |
54 } | 101 } |
55 | 102 |
56 func (s *Sinsei) ChangeExpression() { | 103 func (s *Sinsei) ChangeExpression() { |
57 s.No = "=\"" + strings.TrimSpace(s.No) + "\"" | 104 s.No = "=\"" + strings.TrimSpace(s.No) + "\"" |
58 | 105 |
69 s.Kbn = "転入" | 116 s.Kbn = "転入" |
70 case "09": | 117 case "09": |
71 s.Kbn = "証交" | 118 s.Kbn = "証交" |
72 } | 119 } |
73 s.Kbn, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kbn) | 120 s.Kbn, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kbn) |
74 | 121 } |
75 var bgn, end time.Time | 122 |
76 _, s.Ymd = s.TransDate(s.Ymd) | 123 func read_line(file string) ([]string, error) { |
77 _, s.Ccn = s.TransDate(s.Ccn) | 124 f, err := os.Open(file) |
78 bgn, s.Bgn = s.TransDate(s.Bgn) | 125 if err != nil { |
79 end, s.End = s.TransDate(s.End) | 126 return nil, err |
80 | 127 } |
81 s.Term = fmt.Sprintf("%d", s.CountMonth(bgn, end)) | 128 defer f.Close() |
129 | |
130 var s []string | |
131 scanner := bufio.NewScanner(f) | |
132 for scanner.Scan() { | |
133 s = append(s, scanner.Text()) | |
134 } | |
135 if err := scanner.Err(); err != nil { | |
136 return nil, err | |
137 } | |
138 return s, nil | |
82 } | 139 } |
83 | 140 |
84 func main() { | 141 func main() { |
85 | 142 |
86 if len(os.Args) != 2 { | 143 if len(os.Args) != 5 { |
87 fmt.Fprint(os.Stderr, "bat input.") | 144 fmt.Fprint(os.Stderr, "bat input.") |
88 os.Exit(1) | 145 os.Exit(1) |
89 } | 146 } |
90 | 147 |
91 // Filter Setting | 148 // Filter Setting |
93 From string | 150 From string |
94 To string | 151 To string |
95 } | 152 } |
96 var yf YF | 153 var yf YF |
97 | 154 |
98 content, err := ioutil.ReadFile(jsonfile) | 155 content, err := os.ReadFile(jsonfile) |
99 if err != nil { | 156 if err != nil { |
100 log.Fatal(err) | 157 log.Fatal(err) |
101 } | 158 } |
102 if err := json.Unmarshal(content, &yf); err != nil { | 159 if err := json.Unmarshal(content, &yf); err != nil { |
103 log.Fatal(err) | 160 log.Fatal(err) |
104 } | 161 } |
105 | 162 |
106 // Read CSV | 163 // Read CSV |
107 content, err = ioutil.ReadFile(os.Args[1]) | 164 content, err = os.ReadFile(os.Args[1]) // nintei.csv |
108 if err != nil { | 165 if err != nil { |
109 log.Fatal(err) | 166 log.Fatal(err) |
110 } | 167 } |
111 | 168 |
112 r := csv.NewReader(strings.NewReader(string(content))) | 169 r := csv.NewReader(strings.NewReader(string(content))) |
113 | 170 |
114 records, err := r.ReadAll() | 171 records, err := r.ReadAll() |
172 if err != nil { | |
173 log.Fatal(err) | |
174 } | |
175 | |
176 ikensho, err := read_line(os.Args[2]) // i.csv | |
177 if err != nil { | |
178 log.Fatal(err) | |
179 } | |
180 chosa, err := read_line(os.Args[3]) // c.csv | |
181 if err != nil { | |
182 log.Fatal(err) | |
183 } | |
184 | |
185 remark, err := read_line(os.Args[4]) // t.csv | |
115 if err != nil { | 186 if err != nil { |
116 log.Fatal(err) | 187 log.Fatal(err) |
117 } | 188 } |
118 | 189 |
119 // Main Proccess | 190 // Main Proccess |
120 var sinsei []Sinsei | 191 var sinsei []Sinsei |
121 | 192 |
122 for _, record := range records { | 193 for _, record := range records { |
123 if record[4] < yf.From || record[4] > yf.To { | 194 if record[5] < yf.From || record[5] > yf.To { |
124 continue | 195 continue |
196 } | |
197 var riymd, aymd, rcymd, vymd string | |
198 key := strings.Join([]string{record[0], record[1]}, ",") | |
199 for _, i := range ikensho { | |
200 if strings.HasPrefix(i, key) { | |
201 riymd = strings.Split(i, ",")[2] | |
202 aymd = strings.Split(i, ",")[3] | |
203 break | |
204 } | |
205 } | |
206 for _, c := range chosa { | |
207 if strings.HasPrefix(c, key) { | |
208 rcymd = strings.Split(c, ",")[2] | |
209 vymd = strings.Split(c, ",")[3] | |
210 break | |
211 } | |
212 } | |
213 var rymd string | |
214 for _, t := range remark { | |
215 h := strings.TrimSpace(record[0]) | |
216 c := strings.Split(t, ",") | |
217 if strings.EqualFold(h, c[0]) && strings.EqualFold(record[3], c[1]) { | |
218 rymd = c[2] | |
219 break | |
220 } | |
125 } | 221 } |
126 | 222 |
127 ss := Sinsei{ | 223 ss := Sinsei{ |
128 No: record[0], | 224 No: record[0], |
129 Name: record[1], | 225 Hist: record[1], |
130 Ymd: record[2], | 226 Name: record[2], |
131 Kbn: record[3], | 227 Ymd: record[3], |
132 Ccn: record[4], | 228 Kbn: record[4], |
133 Bgn: record[5], | 229 Ccn: record[5], |
134 End: record[6], | 230 Bgn: record[6], |
135 } | 231 End: record[7], |
136 ss.ChangeExpression() | 232 ReqI: riymd, |
137 | 233 Acc: aymd, |
234 ReqC: rcymd, | |
235 Visit: vymd, | |
236 Remark: rymd, | |
237 } | |
138 sinsei = append(sinsei, ss) | 238 sinsei = append(sinsei, ss) |
139 } | 239 } |
140 | 240 |
141 sort.Slice(sinsei, func(i, j int) bool { | 241 sort.Slice(sinsei, func(i, j int) bool { |
142 return sinsei[i].Ymd < sinsei[j].Ymd | 242 return sinsei[i].Ymd < sinsei[j].Ymd |
143 }) | 243 }) |
144 | 244 |
145 // Output | 245 // Output |
146 header := strings.Join([]string{"被保番", "氏名", "申請日", "区分", "開始日", "終了日", "期間", "審査会"}, ",") | 246 header := strings.Join([]string{"被保番", "氏名", "申請日", "区分", "開始日", "終了日", "期間", "審査会", "日数", "意見書依頼", "日数", "意見書入手", "日数", "調査依頼", "日数", "調査", "日数", "特記", "日数"}, ",") |
147 header, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), header) | 247 header, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), header) |
148 fmt.Println(header) | 248 fmt.Println(header) |
149 | 249 |
250 /* | |
251 for i, s := range sinsei { | |
252 fmt.Print(s) | |
253 fmt.Printf(",=\"0\"&A%d\n", i + 2) | |
254 } | |
255 */ | |
150 for _, s := range sinsei { | 256 for _, s := range sinsei { |
151 fmt.Println(s) | 257 fmt.Println(s) |
152 } | 258 } |
153 } | 259 } |
154 | 260 |