编程实现按笔划排序的方法
2000-08-14 16:46:51
在使用VFP编写应用程序过程中笔者遇到这样一个问题,用户要求对系统中的某一人员库中姓名字段内容按照姓氏笔划由少到多进行排序。使用VFP系统编程的人都知道,VFP系统中没有提供相应的命令和函数实现汉字按笔划排序的功能,而在Word字处理系统中提供了对汉字按笔划的多少进行排序的功能。为了解决应用程序中用户提出的这个要求,笔者利用Windows系统提供的输入法生成器逆转换功能和Word字处理系统的汉字排序功能相结合,使用VFP提供的相应命令和函数,巧妙地实现了数据库中人员姓名字段按笔划排序的要求。
一、生成一个按笔划排序的字典库
利用Windows系统中输入法生成器提供的功能来生成一个包括全部汉字的文本文件。点击Windows开始选单选择程序→附件→输入法生成器,进入输入法生成器窗口,点击逆转换页框,点击打开文件,选择Windows\System文件夹下的拼音输入法字典库WINPY.MB,在码表原文件框中输入为C:\WINPY.TXT,点击逆转换命令按钮,系统对字典库进行转换,最后将在C盘根目录下生成一个名为WINPY.TXT的文本文件,文本文件生成完毕后退出输入法生成器系统。
二、编写程序MAIN.PRG
程序内容如下:
SET SAFETY OFF
set talk off
crea tabl b1 (nr1 c(4))
&&新建一个数据表文件
appe from c:\winPY.txt sdf
&&追加拼音字典文本到数据表中
dele for asc(subs(nr1,3,1))>=128 or recn()<13
pack
REPL NR1 WITH SUBS(NR1,1,2) ALL
inde on nr1 to ls
copy to ls
zap
USE B1
appe from ls
&&对数据表内容进行排序
GO TOP
ABC=′DD′
DO WHIL NOT EOF()
IF NR1=ABC
DELE
ELSE
ABC=NR1
ENDIF
SKIP
ENDDO
PACK
COPY TO C:\BM1 SDF FOR RECN()<=10451
COPY TO C:\BM2 SDF FOR RECN()>10451
=MESSAGEBOX(″请进入Word分别对BM1和BM2文本文件进行排序,排序完毕后保存文件并退出Word″,48,′操作提示′)
&&由于Word系统对文本文件排序的长度受限制,所以生成两个文本文件进行排序。
COPY TO B2 FOR RECN()<1
COPY TO B3 FOR RECN()<1
SELE 0
USE B2
APPE FROM C:\BM1 SDF
USE
SELE 0
USE B3
APPE FROM C:\BM2 SDF
USE
SELE B1
ZAP
APPE FROM B2 FOR RECN()<=5000
APPE FROM B3
APPE FROM B2 FOR RECN()>5000
BROW
COPY TO C:\BM1 SDF FOR RECN()<=10000
COPY TO C:\BM2 SDF FOR RECN()>10000
=MESSAGEBOX(″请再次进入Word分别对BM1和BM2文本文件进行排序,排序完毕后保存文件并退出Word″,48,′操作提示′)
SELE B1
ZAP
APPE FROM C:\BM1 SDF
APPE FROM C:\BM2 SDF
&&删除相同的汉字,保证任意一个汉字在数据表中是惟一的。
程序输入完毕后,运行这个程序,系统将自动建立一个数据表文件,这个数据表文件中保存着全部汉字包括扩展字库及全部繁体汉字共计20902个汉字。
三、在Word中对程序生成的文本文件进行排序
当程序提示进入Word分别对文本文件BM1和BM2进行排序时,首先进入Word编辑系统,打开纯文本文件BM1.TXT,这时Word窗口中显示每行一个汉字共一万余行的文本文件的内容。接着点击Word选单中的表格选单项,选择排序项,进入排序文字窗口,选择排序依据为段落数,类型为笔划,选择递增,当前数据清单为无标题行,设置完毕后点击确定按钮,Word将对BM1.TXT按笔划由少至多进行排序,排序结束后,保存排序后的文件内容后退出。按照同样方法,对BM2.TXT进行排序。
四、利用生成的库文件对要求按笔划进行排序的数据表中内容进行排序
在这里我们以对一个数据表XMK.DBF中人员姓名NAME字段内容按笔划进行排序,这个数据表中要包括一个字段ZZMM,这个字段为字符型,是索引时使用的,这个字段的宽度根据要排序字段的宽度乘以3得来的,这是一个临时使用的字段,数据排序完毕后,可以将这个字段删除。将下列代码写入一个程序或加入表单中某一按钮的Click事件中,即可实现按笔划排序的要求。
USE B1
SELE 0
USE XMK
DO WHIL NOT EOF()
PXZ=′′
FOR I=1 TO LEN(ALLT(NAME)) STEP 2
SELE ZM1
LOCA FOR SUBS(XMK.NAME,I,2)=NR1
ABC=ALLT(STR(RECN()))
PXZ=PXZ+SUBS(′00000′,1,5-LEN(ABC))+ABC
ENDFOR
SELE XMK
REPL ZZMM WITH PXZ
SKIP
ENDDO
SELE XMK
INDE ON ZZMM TO LS
COPY TO LS
ZAP
USE XMK
APPE FROM LS
程序运行完毕后,我们会发现数据表中的姓名字段内容全部是按照笔划的多少进行排序的,完全实现了用户提出的要求。这里笔者提供了汉字按笔划排序的思路,有兴趣的读者也可以在其它编程语言中按照这个原理实现这个功能。
摘自《赛迪网》 穆宣社/文 |
404 Not Found
404 Not Found
nginx
|
|