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