tab_read.pro
来自「basic median filter simulation」· PRO 代码 · 共 148 行
PRO
148 行
pro tab_read,name,tcb,table,header;+; NAME:; TAB_READ ; PURPOSE:; Procedure to read an SDAS table file; CALLING SEQUENCE:; tab_read,name,tcb,table,header; INPUTS:; name - name of the table file; OUTPUTS:; tcb - table control block ; Longword array of size 16 x maxcols+2; where maxcols is the maximum number of columns; allocated for the table.; tcb(*,0) contains:; word 0 SPARE; 1 number of user parameters; 2 max. number of user par. allowed; 3 number of rows in the table; 4 number of allocated rows (for col. ordered tab); 5 number of columns defined; 6 max number of columns; 7 length of row used (in units of 2-bytes); 8 max row length (in units of 2-bytes); relevant only for row ordered tables.; 9 table type (11 for row order, 12 for col. order); 15 update flag (0-readonly, 1-update); tcb(*,i) contains description of column i; word 0 column number; 1 offset for start of row in units of 2-bytes; 2 width or column in 2-byte units; 3 data type; 6 = real*4; 7 = real*8; 4 = integer*4; 1 = boolean*4; 2 = character string; 4-8 ascii column name up to 19 characters; 9-13 column units (up to 19 characters); 14-15 format string; tcb(*,max number of columns+1)= file name;; table - table array, Byte array row length (bytes) x nrows;; header - header parameters in form usable by sxpar, sxaddhist,; sxaddpar, ect.; HISTORY:; Version 1 D. Lindler Jan 88; Converted to NEW IDL April 90 D. Lindler; Converted to IDL V5.0 W. Landsman September 1997;-;------------------------------------------------------------------------if n_params(0) lt 2 then begin print,'TAB_READ -- output table control block not supplied' retallendif;; open file;fdecomp,name,disk,dir,root,extif ext eq '' then ext = 'tab'fname=disk+dir+root+'.'+ext!err=0openr,unit,fname,/get_lun,error=errif err lt 0 then begin free_lun,unit message,'Error opening file '+fname,/CON print,!ERROR_STATE.MSG retallend;; read header record;lrec=assoc(unit,lonarr(12),0)h=lrec[0]maxpar=h[1]maxcol=h[5]type=h[8];; create table control block;tcb=lonarr(16,maxcol+2)tcb[0]=[unit,h,0,0,0]sbyte=12*4+h[1]*80L ;starting byte of column descriptionslrec = assoc(unit,lonarr(16,maxcol),sbyte)tcb[0,1]=lrec[0] ;read col. descriptionsbyte_name=replicate(32b,64)byte_name[0]=byte(fname)tcb[0,maxcol+1]=long(byte_name,0,16) ;place filename into tcb;; read data;rowlen=MAX([tcb[7,0],tcb[8,0]])*2nrows=MAX([tcb[4,0],tcb[3,0]])offset=12*4+tcb[2,0]*80+tcb[6,0]*16*4 ;offset of data in the filebrec=assoc(unit,bytarr(1)) ; we will read into a byte arrayif type eq 11 then begin ; row ordered brec = assoc(unit,bytarr(rowlen,nrows,/nozero),offset) table=brec[0] ;read table end else begin ; column ordered table table=bytarr(rowlen,nrows) ncols=tcb[5,0] if ncols gt 0 then begin for i=1,ncols do begin tab_col,tcb,i,position,width,datatype brec = assoc(unit,bytarr(width,nrows,/nozero),offset) column=brec[0] ; read column offset=offset+nrows*width ;offset to next col table[position,0]=column ;insert into table endfor endifendelse;; read header;if n_params(0) gt 3 then begin ;read only if output parameter supplied npar=tcb[1,0] header=strarr(npar+1) header[0]='END'+string(replicate(32b,77)) if npar gt 0 then begin brec = assoc(unit,bytarr(80,npar,/nozero),12*4) htab=string(brec[0]) ;read table header for i=0,npar-1 do begin ;convert to FITS header line=htab[i] keyword=strmid(line,0,8) type=strmid(line,8,1) value=nulltrim(strmid(line,9,71)) if strtrim(keyword ne '') then begin case type of ;convert value to correct type 't': 'b': if value eq '0' then value='F' else value='T' 'i': value=long(strtrim(value)) 'r': value=float(strtrim(value)) 'd': value=double(strtrim(value)) endcase sxaddpar,header,keyword,value end endfor endifendifclose,unitfree_lun,unitreturnend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?