UWSCで日本郵便の郵便番号データからの検索
UWSCの公式掲示板の記事より。
http://www3.bigcosmic.com/board/s/board.cgi?id=umiumi&mode=all&no=3715
このLinersさんの回答が、あまりに素晴らしい。
12万件というデータ量を、ほぼ瞬時にこなしています。
ポイントは、windowsのfindstrコマンドを使うこと、です。
こういう着眼点が欲しいなぁ、、、。
ぱっと思いつかない。
ただこの回答、テンポラリファイルはいらないんじゃ、、、と思ったので、ちょっと試行錯誤してみました。
そこで気づいたのは、、、「連想配列って、可変長配列としてそのまま使える!」
知らなかったので、ついでに記事にしてみました。
前作った、Array.uws、いらないんじゃ、、、。
連想配列、便利過ぎ。
OPTION EXPLICIT DIM loop = TRUE, str, k = GETSTR(0) WHILE loop k = INPUT("検索文字列を入力してください", k) IFB k <> EMPTY THEN str = Search(k) IFB LENGTH(str) > 8 THEN DIM add = str, p = TOKEN(",", add) IF MSGBOX("郵便番号 : " + p + "<#CR>" + " 住所 : " + add + "<#CR><#CR>クリップボードにコピーしますか?", BTN_YES or BTN_NO) = BTN_YES THEN SENDSTR(0, str) loop = FALSE ENDIF ELSE loop = FALSE ENDIF WEND FUNCTION Search(address) DIM all = TRIM(DOSCMD("findstr /R <#dbl>" + address + "<#dbl> KEN_ALL.csv")) HASHTBL d DIM i = 0, l, j, b, c WHILE all <> "" l = TRIM(TOKEN(CHR(13), all)) FOR j = 1 TO 9 c = TOKEN(",", l) IFB j = 3 or j = 7 or j = 8 or j = 9 THEN c = TRIM(REPLACE(c, "<#DBL>", "")) IFB j = 3 THEN b = c + "," ELSE b = b + c ENDIF ENDIF NEXT d[i] = b i = i + 1 WEND IFB i = 0 THEN MSGBOX("該当がありません") RESULT = "," ELSEIF i = 1 THEN RESULT = d[0] ELSE RESULT = SLCTBOX(SLCT_LST or SLCT_STR, 0, address + " : "+ i + " 件", d) ENDIF FEND