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 |
