t1 = SECONDS()
CLOSE DATABASES
USE 选择\sp ALIAS aa
ln = OCCURS(",", jmss1) + 1 && 获取题目的数量
FOR lnj = 1 TO ln
CREATE CURSOR fz (nfz n(4, 2), nsl I) && 保存分值的
INDEX on nfz TAG fz
SELECT VAL(GETWORDNUM(jmss1, lnj, ",")) nfz FROM aa INTO CURSOR temp
SCAN
IF SEEK(temp.nfz, "fz", "fz") = .T.
REPLACE nsl WITH nsl + 1 IN fz
ELSE
INSERT INTO fz VALUES (temp.nfz, 1)
ENDIF
ENDSCAN
ENDFOR
MESSAGEBOX(SECONDS() - t1)
SELECT fz
BROWSE
直接用group by不一样么,快不少
t1 = SECONDS()
CLOSE DATABASES
USE sp ALIAS aa
ln = OCCURS(",", jmss1) + 1 && 获取题目的数量
FOR lnj = 1 TO ln temp="temp"+"_"+TRANSFORM(m.lnj) SELECT VAL(getwordnum(jmss1,m.lnj,",") )nfz ,COUNT(*) as nrs FROM aa INTO CURSOR (temp) GROUP BY 1
ENDFOR
MESSAGEBOX(SECONDS() - t1)
BROWSE
把程序放到C盘,变成144秒(C盘是固态盘,I是以前的机械盘)
把这个,去掉,就变成1.6秒,速度和写盘,有很大关系 IF SEEK(VAL(GETWORDNUM(aa.jmss1, lnj, ",")), "fz", "fz") = .T. *REPLACE nsl WITH nsl + 1 IN fz ELSE *INSERT INTO fz VALUES (VAL(GETWORDNUM(aa.jmss1, lnj, ",")), 1) ENDIF
********************************
SET DEFAULT TO c:\abc
T1 = SECONDS()
CLOSE DATABASES
USE 选择\sp ALIAS aa
ln = OCCURS(",", jmss1) + 1 && 获取题目的数量
FOR lnj = 1 TO ln CREATE CURSOR fz (nfz n(4, 2), nsl I) && 保存分值的 INDEX on nfz TAG fz SELECT aa SCAN IF SEEK(VAL(GETWORDNUM(aa.jmss1, lnj, ",")), "fz", "fz") = .T. REPLACE nsl WITH nsl + 1 IN fz ELSE INSERT INTO fz VALUES (VAL(GETWORDNUM(aa.jmss1, lnj, ",")), 1) ENDIF ENDSCAN
ENDFOR
MESSAGEBOX(SECONDS() - T1)
我的代码,按照要求不用任何Select ... 语句 ,另辟蹊径用了字典对象,供大家参考:
IF NOT USED('sp') THEN USE "C:\sp.dbf" IN 0 EXCLUSIVE&&改成你的路径
ENDIF
LOCAL icnt as Integer ,ii as Integer
LOCAL ckey as String ,str1 as String
LOCAL time11 as Datetime ,time22 as Datetime
IFUSED('result1') THEN USE IN result1
ENDIF
LOCALoDic As Object
oDic = CreateObject("Scripting.Dictionary")
time11 = SECONDS()
SELECT sp
GO TOP
SCAN str1 = ALLTRIM(sp.jmss1) icnt = ALINES(arr2,str1,1,",") FOR ii =1 TO icnt ckey = LTRIM(STR(ii)) - "_" - arr2(ii) IF odic.Exists(ckey) THEN odic.Item(ckey) = odic.Item(ckey) + 1 ELSE odic.Add( ckey,1) && ENDIF ENDFOR
ENDSCAN
DIMENSION arrKey(1) as String
arrKey =odic.Keys
CREATE CURSOR result1 (第几题 c(4) , 分值 c(4),次数 i )
FOR ii = 1 TO odic.Count&&
*!*tmp11 = LEFT(arrKey(ii), AT('_',arrKey(ii)) -1)
*!*tmp22 = SUBSTR(arrKey(ii), AT('_',arrKey(ii)) +1)
*!*tmp33 = odic.Item(arrKey(ii)) INSERT INTO result1 (第几题, 分值 ,次数) ; VALUES ( LEFT(arrKey(ii), AT('_',arrKey(ii)) -1),; SUBSTR(arrKey(ii), AT('_',arrKey(ii)) +1), ; odic.Item(arrKey(ii)) )
ENDFOR
time22 = SECONDS()
odic.RemoveAll
RELEASE oDic
SELECT result1
INDEX on 第几题 + 分值 TO 'C:\ind12'&&改成你的路径
BROWSE TITLE "总耗时" +LTRIM(STR(time22 - time11 ,14,4 ))