Mercurial > mercurial > hgweb_kaigo.hg.cgi
comparison superFC/fc_tmpl.go @ 4:ff7a3c254956 draft
new: superFC
author | pyon <pyon@macmini> |
---|---|
date | Tue, 15 Jun 2021 06:19:45 +0900 |
parents | |
children | 519d6fd0bfd9 |
comparison
equal
deleted
inserted
replaced
3:bbeb834023e3 | 4:ff7a3c254956 |
---|---|
1 /* | |
2 fcgo.go: Fucho de Go | |
3 | |
4 Last Change: 2021-06-14 月 16:14:04. | |
5 */ | |
6 package main | |
7 | |
8 /* | |
9 #cgo LDFLAGS: -L. -lxdwapi -static | |
10 ##### C_SOURCE ##### | |
11 */ | |
12 import "C" | |
13 | |
14 import ( | |
15 "encoding/csv" | |
16 "flag" | |
17 "fmt" | |
18 "io" | |
19 "log" | |
20 "os" | |
21 "regexp" | |
22 "strings" | |
23 "time" | |
24 | |
25 "golang.org/x/text/encoding/japanese" | |
26 "golang.org/x/text/transform" | |
27 ) | |
28 | |
29 type Data struct { | |
30 Hno string | |
31 Page string | |
32 } | |
33 | |
34 func (d *Data) ToCsv() string { | |
35 s := []string{d.Hno, d.Page} | |
36 return strings.Join(s, ",") | |
37 } | |
38 | |
39 var ( | |
40 ver = "0.1" | |
41 | |
42 clean bool | |
43 skip bool | |
44 debug bool | |
45 xdwfile string | |
46 | |
47 txtfile = "fctmp_txt.txt" | |
48 infofile = "fctmp_info.csv" | |
49 orderfile = "sort.list" // input | |
50 pagefile = "fctmp_page.txt" | |
51 output = "output.xdw" | |
52 ) | |
53 | |
54 func init() { | |
55 /* INITIALIZE FLAGS */ | |
56 flag.BoolVar(&clean, "c", false, "clean temporary files & exit") | |
57 flag.BoolVar(&skip, "e", false, "use existed files") | |
58 flag.BoolVar(&debug, "d", false, "debug mode") | |
59 flag.StringVar(&xdwfile, "i", "fc.xdw", "target xdw file") | |
60 } | |
61 | |
62 func main() { | |
63 flag.Parse() | |
64 | |
65 /* PRINT HEADER */ | |
66 fmt.Println("===================================================") | |
67 fmt.Println(" 普徴のみならず納通なら被保番でソートできるかも... ") | |
68 fmt.Printf(" - fcgo [ver %s] -\n", ver) | |
69 fmt.Println("===================================================\n") | |
70 print_time("now") | |
71 fmt.Println("[0] start ...") | |
72 | |
73 /* CLEAN TEMPORARY DIRECTORY */ | |
74 os.Remove(output) | |
75 if !skip { | |
76 clean_full() | |
77 } | |
78 if clean { | |
79 os.Exit(0) | |
80 } | |
81 print_time("check done") | |
82 | |
83 fmt.Println("[1] extract ...") | |
84 if !skip { | |
85 C.xdw2txt(C.CString(xdwfile), C.CString(txtfile)) | |
86 } | |
87 print_time("extract done.") | |
88 | |
89 c := make(chan int) | |
90 fmt.Println("[2] split ... (run background)") | |
91 go func() { | |
92 if !skip { | |
93 C.xdwsplit1(C.CString(xdwfile)) | |
94 } | |
95 print_time("split done.") | |
96 c <- 1 | |
97 }() | |
98 | |
99 fmt.Println("[3] analize ...") | |
100 data_hash, err := analize(txtfile, infofile) | |
101 if err != nil { | |
102 log.Fatal(err) | |
103 } | |
104 print_time("analize done.") | |
105 debug_print(debug, fmt.Sprintf("len = %d", len(data_hash))) | |
106 | |
107 fmt.Println("[4] read order ...") | |
108 h_order, n, err := read_order(orderfile) | |
109 if err != nil { | |
110 log.Fatal(err) | |
111 } | |
112 print_time("read order done.") | |
113 debug_print(debug, fmt.Sprintf("len = %d / %d", len(h_order), n)) | |
114 | |
115 fmt.Println("[5] make_list ...") | |
116 n, err = make_list(h_order, data_hash, pagefile) | |
117 if err != nil { | |
118 log.Fatal(err) | |
119 } | |
120 print_time("make list done.") | |
121 debug_print(debug, fmt.Sprintf("order = %d", n)) | |
122 | |
123 <-c | |
124 | |
125 fmt.Println("[6] merge ...") | |
126 clean_mini() | |
127 C.xdwmerge(C.CString(pagefile), C.CString(output)) | |
128 print_time("merge done.") | |
129 clean_mini() | |
130 | |
131 fmt.Println("[7] page ...") | |
132 C.xdwaddpage(C.CString(output), C.int(1)) | |
133 print_time("page done.") | |
134 | |
135 if !debug { | |
136 fmt.Println("[8] clean ...") | |
137 clean_full() | |
138 print_time("clean done.") | |
139 } | |
140 } | |
141 | |
142 func analize(txtfile, infofile string) (map[string]Data, error) { | |
143 hash := make(map[string]Data) | |
144 | |
145 c, err := os.ReadFile(txtfile) | |
146 if err != nil { | |
147 return hash, err | |
148 } | |
149 r := strings.NewReader(string(c)) | |
150 tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) | |
151 b, err := io.ReadAll(tr) | |
152 if err != nil { | |
153 return hash, err | |
154 } | |
155 | |
156 regHno := regexp.MustCompile(`0[1238]0[0-9]{7}`) | |
157 | |
158 var csv string | |
159 | |
160 buf := strings.Split(string(b), "期別保険料額") | |
161 for p, v := range buf[:len(buf)-1] { | |
162 s := zen2han(v) | |
163 hno := regHno.FindString(s) | |
164 page := fmt.Sprintf("%05d", p + 1) | |
165 | |
166 data := Data { | |
167 Hno: hno, | |
168 Page: page, | |
169 } | |
170 hash[hno] = data | |
171 | |
172 csv += data.ToCsv() + "\n" | |
173 } | |
174 | |
175 if err := os.WriteFile(infofile, []byte(csv), 0644); err != nil { | |
176 return hash, err | |
177 } | |
178 return hash, nil; | |
179 } | |
180 | |
181 func zen2han(s string) (string) { | |
182 s = strings.ReplaceAll(s, "0", "0") | |
183 s = strings.ReplaceAll(s, "1", "1") | |
184 s = strings.ReplaceAll(s, "2", "2") | |
185 s = strings.ReplaceAll(s, "3", "3") | |
186 s = strings.ReplaceAll(s, "4", "4") | |
187 s = strings.ReplaceAll(s, "5", "5") | |
188 s = strings.ReplaceAll(s, "6", "6") | |
189 s = strings.ReplaceAll(s, "7", "7") | |
190 s = strings.ReplaceAll(s, "8", "8") | |
191 return strings.ReplaceAll(s, "9", "9") | |
192 } | |
193 | |
194 func read_order(csvfile string) ([]string, int, error) { | |
195 var order []string | |
196 | |
197 c, err := os.ReadFile(csvfile) | |
198 if err != nil { | |
199 return order, -1, err | |
200 } | |
201 r := strings.NewReader(string(c)) | |
202 tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) | |
203 b, err := io.ReadAll(tr) | |
204 if err != nil { | |
205 return order, -1, err | |
206 } | |
207 | |
208 n := 0 | |
209 cr := csv.NewReader(strings.NewReader(string(b))) | |
210 for { | |
211 record, err := cr.Read() | |
212 if err == io.EOF { | |
213 break | |
214 } | |
215 if err != nil { | |
216 return order, n, err | |
217 } | |
218 | |
219 s := zen2han(record[0]) | |
220 if strings.HasPrefix(s, "0") { | |
221 order = append(order, s) | |
222 } | |
223 n++ | |
224 } | |
225 return order, n, nil | |
226 } | |
227 | |
228 func make_list(h_order []string, hash map[string]Data, pagefile string) (int, error) { | |
229 var n int | |
230 var list []string | |
231 done := make(map[string]bool) | |
232 | |
233 for _, h := range h_order { | |
234 if _, ok := done[h]; !ok { | |
235 if data, ok := hash[h]; ok { | |
236 list = append(list, data.Page) | |
237 done[h] = true | |
238 n++ | |
239 } | |
240 } | |
241 } | |
242 | |
243 if err := write_pagefile(pagefile, list); err != nil { | |
244 return n, err | |
245 } | |
246 return n, nil | |
247 } | |
248 | |
249 func write_pagefile(file string, list []string) error { | |
250 f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE, 0755) | |
251 if err != nil { | |
252 return err | |
253 } | |
254 for _, p := range list { | |
255 fmt.Fprintf(f, "fctmp_%s.xdw\n", p) | |
256 } | |
257 if err := f.Close(); err != nil { | |
258 return err | |
259 } | |
260 return nil | |
261 } | |
262 | |
263 func print_time(msg string) { | |
264 now := time.Now() | |
265 fmt.Printf("\t%v # %s\n", now, msg) | |
266 } | |
267 | |
268 func debug_print(debug bool, msg string) { | |
269 if debug { | |
270 fmt.Printf("\t%s\n", msg) | |
271 } | |
272 } | |
273 | |
274 func clean_full() error { | |
275 return clean_file("fctmp_") | |
276 } | |
277 | |
278 func clean_mini() error { | |
279 return clean_file("fctmp_b") | |
280 } | |
281 | |
282 func clean_file(prefix string) error { | |
283 files, err := os.ReadDir(".") | |
284 if err != nil { | |
285 return err | |
286 } | |
287 | |
288 for _, file := range files { | |
289 if strings.HasPrefix(file.Name(), prefix) { | |
290 os.Remove(file.Name()) | |
291 continue | |
292 } | |
293 } | |
294 return err | |
295 } | |
296 |