0
|
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
|