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