Mercurial > mercurial > hgweb_porori.cgi
comparison Porori/src2/porori.go @ 0:2b4fc52a96d9
porori.
author | pyon@macmini |
---|---|
date | Wed, 12 Feb 2020 18:57:24 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:2b4fc52a96d9 |
---|---|
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 |