CREATE CURSOR Words (Word C(39)) APPEND FROM text.txt CSV INDEX ON LOWER(Word) TAG word ALINES(aKeyCode,STRTRAN("0 1 2abc 3def 4ghi 5jkl 6mno 7pqrs 8tuv 9wxyz"," ",CHR(13))) cPhonenumber = "642-394-6369" cPhonenumber = STRTRAN(cPhoneNumber, "-","") CREATE CURSOR Results (Word C((2*LEN(cPhonenumber)))) nSec = SECONDS() SELECT WORDS GetWords(cPhoneNumber,"","") ? SECONDS() - nSec SELECT Results BROWSE NORM RETURN *- PROCEDURE GetWords (cUncoded, cCoded, cWordpart) LOCAL nT, cChar, cChars DO CASE CASE !EMPTY(cUncoded) cChars = aKeyCode[VAL(LEFT(cUncoded,1))+1] FOR nT = 1 TO LEN(cChars) cChar = SUBSTR(cChars, nT, 1) DO CASE CASE KEYMATCH(cWordPart+cChar+" ") GetWords(SUBSTR(cUnCoded,2), cCoded+IIF(EMPTY(cWordPart) AND !EMPTY(cCoded),"-","")+cChar, "") CASE EMPTY(cWordPart) AND nT = 1 GetWords(SUBSTR(cUnCoded,2), cCoded+IIF(ISALPHA(RIGHT(cCoded,1)),"-","")+cChar, "") ENDCASE IF nT > 1 AND KEYMATCH(cWordPart+cChar) AND LEN(cUncoded) > 1 GetWords(SUBSTR(cUnCoded,2), cCoded+IIF(EMPTY(cWordPart) AND !EMPTY(cCoded),"-","")+cChar, cWordPart+cChar) ENDIF ENDFOR CASE EMPTY(cWordPart) OR KEYMATCH(cWordPart+" ") INSERT INTO Results VALUES (cCoded) ENDCASE RETURNAs you see, very compact and fast.