本帖最后由 llsheng_73 于 2024-11-3 13:56 编辑
test-read里边应该是有问题的,用十来个数据测试后发现结果是错的
xy(cons (cdr(assoc zd a)) xy)这里有问题,字段值的顺序会乱,造成变量名和关键字顺序不一致,最终结果错误。
这个地方只能通过append往后增加新关键字才能保持顺序一致
通过动态重复定义变量,最后对所产生的变量逐一取值,避免重复对大表进行替换、连接等更新操作,确实对速度提升极为明显,唯一缺点是中途是产生较多全局变量,虽然结束前被重置为了nil,但始终感觉不太好,由于个在强迫症的原因,采用同样的思想,但临时结果不放到变量里边,而是放到表里边,通过内部函数nth<-来进行表的替换,经测试,速度还行,但有效避免了大量临时全局变量
楼主的测试数据子表各项有明确的字段名称,其优点在于数据可以很灵活,不依赖于字段顺序,缺点是增大数据量和处理步骤,下边的处理程序对数据不要求字段名,对于大表可以明显减少数据量,但缺点是对数据字段顺序要求很严格
- (defun test-nth<-(lst m / a b c i n r);lst为待处理的关联表,m为关键字段在子表中位置,即以第几项为分组依据,整数;
- (setq i -1 r(make-list(length lst)'(nil)))
- (foreach a lst
- (if(setq b(nth m a)c(assoc b r))
- (setq n(vl-position c r))
- (setq i(1+ i)n i))
- (nth<- n(vl-list* b a(cdr c))r))
- (vl-remove'(nil)r))
内部函数的激活采用高飞鸟的程序进行处理
- ((lambda(/ o s b);;;高飞鸟方法激活内部函数
- (or(=(type tranf)'USUBR)
- (progn(vl-load-com)
- (and(findfile(setq o(strcat(getenv "UserProfile")"\\Intern.fas")))
- (vl-file-delete o))
- (vlax-safearray-fill(setq s(vlax-create-object "ADODB.Stream")b(vlax-make-safearray 17 (cons 0 56)))
- (list 70 65 83 52 45 70 73 76 69 13 49 13 49 32 36 1 36 51 51 32 48 32 36 86 58 76 80 80 0 105 110
- 116 101 114 110 0 108 112 112 45 115 121 109 102 117 110 45 62 97 108 0 0 57 3 0 22 36))
- (vlax-put-property s 'type 1)
- (vlax-invoke s(function open))
- (vlax-invoke-method s(function Write)b)
- (vlax-invoke-method s(function saveToFile)o 2)
- (vlax-invoke-method s(function close))
- (vl-every(function set)'(:lpp intern lpp-symfun->al)(mapcar'eval(load o)))
- (vl-file-delete o)
- (defun tranf(s)(lpp-symfun->al(intern s :lpp)))
- (tranf(function al-add-subr-name))
- (mapcar(function al-add-subr-name)'(al-add-subr-name lpp-symfun->al intern))))
- (vl-every(function tranf)'("init:autolisp-package""make-list""nth<-"))))
|