📄 tab_addcol.pro
字号:
pro tab_addcol,name,data,tcb,tab;+; NAME:; TAB_ADDCOL ; PURPOSE:; Procedure to add a new column to an existing STSDAS table.;; CALLING SEQUENCE:; tab_addcol, name, data, tcb, tab;; INPUTS:; name - column name; data - sample data of type to be written to the column.; This parameter is only used to determine data type.;; INPUT/OUTPUTS:; tcb - table control block; tab - table array;; HISTORY:; version 1 D. Lindler April 89; Converted to IDL V5.0 W. Landsman September 1997;-;------------------------------------------------------------------------;; If column alread exists, do not add it; tab_col,tcb,name if !err gt 0 then return;; determine data type and change to stsdas table code; s=size(data) & dtype=s[s[0]+1] & ndim=s[0] case dtype of 0: type=6 ;undefined, assume real*4 7: type=2 ;string 1: type=1 ;byte (assume boolean) 2: type=4 ;integer 4: type=6 ;real*4 3: type=4 ;integer 5: type=7 ;double precision 6: begin print,'TAB_ADDCOL-- complex data type not supported' retall end endcase;; determine field width; case type of 2: begin ;string width=max(strlen(data)) width=(width+3)/4*2 ;change to multiple of 4 bytes end 7: width=4 ;double precision else: width=2 ;integer, real, or boolean endcase;; get current table size; nrows=tcb[3] ncols=tcb[5] rowlen=tcb[7] maxrows=tcb[4]>nrows maxcols=tcb[5] maxrowlen=tcb[8]>rowlen;; updated table size; new_nrows=nrows>n_elements(data) new_ncols=ncols+1 new_rowlen=rowlen+width;; do we need to expand the table; if (new_nrows gt maxrows) or (new_ncols gt maxcols) or $ (new_rowlen gt maxrowlen) then $ tab_expand,tcb,tab,new_ncols,new_nrows,new_rowlen;; construct default print format; case type of 1: form='8b' ;boolean 2: form=''+strtrim(width*2,2)+'s' ;string 4: form='11d' ;integer 6: form='16.8g' ;real*4 7: form='20.12g' ;real*8 endcase;; insert column information into tcb; newcol=bytarr(48) newcol[0]=byte(name) newcol[40]=byte(form) tcb[0,new_ncols]=[long(new_ncols),rowlen,width,type,long(newcol,0,12)] tcb[5]=new_ncols tcb[7]=new_rowlen;; fill new column with nulls; if nrows gt 0 then begin case type of 1: null=0L 2: null=string(0b) 4: null='80000000'XL 6: null=1.6e38 7: null=1.6d38 endcase if type eq 2 then nulls=bytarr(width*2,nrows)+null $ else nulls=replicate(null,nrows) nulls=byte(nulls,0,width*2,nrows) tab[rowlen*2,0]=nulls endifreturnend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -