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