Mercurial > mercurial > hgweb_golang.cgi
comparison src/matsu/matsu.go @ 32:efa8836fd428
add encoding japanse & rune sample.
author | pyon@macmini |
---|---|
date | Fri, 17 May 2019 19:50:32 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
31:a55c5a0cbd04 | 32:efa8836fd428 |
---|---|
1 /* | |
2 Matsu2 | |
3 訪問調査依頼一覧出力プログラム | |
4 original written by GNU-awk | |
5 | |
6 Last Change: 2019-05-17 金 15:39:21. | |
7 */ | |
8 package main | |
9 | |
10 /* | |
11 #cgo LDFLAGS: -L. -lxdwapi -static | |
12 #include <stdio.h> | |
13 #include <string.h> | |
14 | |
15 #include <windows.h> | |
16 #include <xdw_api.h> | |
17 | |
18 char* xdw_x2t(const char* file) { | |
19 char in_path[_MAX_PATH]; | |
20 _fullpath(in_path, file, _MAX_PATH); | |
21 | |
22 XDW_DOCUMENT_HANDLE h = NULL; // 文書ハンドルを開く | |
23 XDW_OPEN_MODE_EX mode = {sizeof(XDW_OPEN_MODE_EX), XDW_OPEN_READONLY, XDW_AUTH_NODIALOGUE}; | |
24 if (XDW_OpenDocumentHandle(in_path, &h, (XDW_OPEN_MODE*)&mode)) { | |
25 printf("Error: cannot open %s\n", file); | |
26 return NULL; | |
27 } | |
28 | |
29 XDW_DOCUMENT_INFO info = {sizeof(XDW_DOCUMENT_INFO), 0, 0, 0}; // 総ページ数を得る | |
30 XDW_GetDocumentInformation(h, &info); | |
31 int nPage = info.nPages; | |
32 | |
33 // メイン処理 | |
34 char *lpszvalue, *all_lpszvalue; | |
35 long datasize[9999]; | |
36 for (int i=1; i<=nPage; i++) { | |
37 datasize[i] = XDW_GetPageTextToMemory(h, i, NULL, 0, NULL); | |
38 datasize[0] += datasize[i]; | |
39 } | |
40 datasize[0] += nPage - 1; // for "\n" | |
41 all_lpszvalue = (char*)malloc(sizeof(char)*datasize[0]); | |
42 all_lpszvalue[0] = '\0'; | |
43 for (int i=1; i<=nPage; i++) { | |
44 if (i<nPage) datasize[i]++; // for "\n" | |
45 lpszvalue = (char*)malloc(sizeof(char)*(datasize[i])); | |
46 XDW_GetPageTextToMemory(h, i, lpszvalue, datasize[i], NULL); | |
47 strcat(all_lpszvalue, lpszvalue); | |
48 if (i<nPage) strcat(all_lpszvalue, "\n"); | |
49 free(lpszvalue); | |
50 } | |
51 | |
52 XDW_CloseDocumentHandle(h, NULL); // 文書ハンドルを閉じる | |
53 return all_lpszvalue; | |
54 } | |
55 */ | |
56 import "C" | |
57 import ( | |
58 "bufio" | |
59 "fmt" | |
60 "flag" | |
61 "log" | |
62 "os" | |
63 "regexp" | |
64 "strings" | |
65 | |
66 "golang.org/x/text/encoding/japanese" | |
67 "golang.org/x/text/transform" | |
68 ) | |
69 | |
70 func main() { | |
71 infile := flag.String("i", "KBPC116G.xdw", "input file") | |
72 outfile := flag.String("o", "-", "output file") | |
73 utf8 := flag.Bool("w", false, "write utf8") | |
74 verbose := flag.Bool("v", false, "verbose") | |
75 vverbose := flag.Bool("vv", false, "very verbose") | |
76 version := flag.Bool("V", false, "print version") | |
77 flag.Parse() | |
78 | |
79 if *version { | |
80 fmt.Println("matsu2 - v1.0") | |
81 os.Exit(0) | |
82 } | |
83 if *vverbose { | |
84 *verbose = true | |
85 } | |
86 | |
87 s := C.GoString(C.xdw_x2t(C.CString(*infile))) | |
88 r := strings.NewReader(s) | |
89 tr := transform.NewReader(r, japanese.ShiftJIS.NewDecoder()) | |
90 | |
91 f := os.Stdout | |
92 if *outfile != "-" { | |
93 var err error | |
94 f, err = os.Create(*outfile) | |
95 if err != nil { | |
96 log.Fatal(err) | |
97 } | |
98 defer f.Close() | |
99 } | |
100 | |
101 if *verbose { | |
102 fmt.Fprintln(os.Stderr, "input: " + *infile) | |
103 fmt.Fprintln(os.Stderr, "output: " + *outfile) | |
104 } | |
105 | |
106 var rehhsno = regexp.MustCompile(`0[1238]\d{8}`) | |
107 var redate = regexp.MustCompile(`((明治)|(大正)|(昭和)|(平成)|(令和)).{1,2}年.\d月.\d日`) | |
108 var recity = regexp.MustCompile(`(((平成)|(令和)).{1,2}年.\d月.\d日){2}...`) | |
109 var rename = regexp.MustCompile(`0[1238]\d{8}.*((平成)|(令和)).{1,2}年.\d月.\d日`) | |
110 var rezensp = regexp.MustCompile(` {2,}`) | |
111 | |
112 w := bufio.NewWriter(f) | |
113 if !*utf8 { | |
114 tw := transform.NewWriter(f, japanese.ShiftJIS.NewEncoder()) | |
115 w = bufio.NewWriter(tw) | |
116 } | |
117 header := []string{"申請日", "被保番", "氏名", "生年月日", "市町村", "-", "-", "-", "依頼日"} | |
118 fmt.Fprintln(w, strings.Join(header, ",")) | |
119 | |
120 var p, q int | |
121 var req string | |
122 buf := bufio.NewScanner(tr) | |
123 for buf.Scan() { | |
124 str := strings.TrimRight(buf.Text(), " ") | |
125 if strings.HasSuffix(str, "依頼書") { | |
126 req = redate.FindString(str) | |
127 req = strings.Replace(req, " ", "", -1) | |
128 if *verbose { | |
129 p++ | |
130 fmt.Fprintf(os.Stderr, "req: %d\n", p) | |
131 } | |
132 } else { | |
133 row := strings.Split(str, "〒") | |
134 for i := 0; i < len(row) - 1; i++ { | |
135 var app, hhsno, name, birth, city, empty string | |
136 | |
137 d := redate.FindAllString(row[i], -1) | |
138 if len(d) > 0 { | |
139 birth = strings.Replace(d[0], " ", "", -1) | |
140 app = strings.Replace(d[1], " ", "", -1) | |
141 } | |
142 if rehhsno.MatchString(row[i]) { | |
143 hhsno = "=\"" + rehhsno.FindString(row[i]) + "\"" | |
144 } | |
145 if rename.MatchString(row[i]) { | |
146 n := []rune(rename.FindString(row[i])) | |
147 kana := string(n[10:36]) | |
148 kana = strings.Trim(kana, " ") | |
149 name = string(n[37:55]) | |
150 name = strings.Trim(name, " ") | |
151 name = rezensp.ReplaceAllString(name, "") | |
152 name += "(" + kana + ")" | |
153 } | |
154 if recity.MatchString(row[i]) { | |
155 c := []rune(recity.FindString(row[i])) | |
156 city = string(c[len(c)-3:]) | |
157 city = strings.Replace(city, "仙北郡", "美郷町", -1) | |
158 } | |
159 | |
160 if hhsno != "" { | |
161 fields := []string{app, hhsno, name, birth, city, empty, empty, empty, req} | |
162 fmt.Fprintln(w, strings.Join(fields, ",")) | |
163 if *vverbose { | |
164 fmt.Fprintf(os.Stderr, " %02d: %s\n", i + 1, hhsno[2:12]) | |
165 } | |
166 q++ | |
167 } | |
168 } | |
169 } | |
170 } | |
171 | |
172 if *verbose { | |
173 fmt.Fprintf(os.Stderr, "finish [%d customer]\n", q) | |
174 } | |
175 w.Flush() | |
176 } | |
177 |