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 |
