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