32
|
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
|