||
现总结几个现在用到的IDL读写数据的函数,随着学习和使用的深入逐步补充和完善。
IDL在读写格式化数据方面有两种格式化文件之区分:自由文件格式和确定的文件格式。
格式化文件有时叫做ASCII 文件或者纯文本文件。
自由文件格式 自由格式文件用逗号或空白(tab 键和空格键)分开文件中的每个元素,这没有确定的文件格式正规。
确定的文件格式 确定的格式文件是用格式说明按照给定的规范进行编排的。IDL格式说明和FORTRAN 或C 程序中的格式说明类似。
一、如何打开文件进行读写
openr 打开文件进行读。(OPENR, Unit, File)
openw 打开文件进行写。(OPENW, Unit, File)
openu 打开文件进行更新(也就是说,读和/或写)。(OPENU, Unit, File)
二、查找和选择数据文件
1.dialog_pickfile()
Syntax :
Result = DIALOG_PICKFILE( [,DEFAULT_EXTENSION=string] [, /DIRECTORY] [, DIALOG_PARENT=widget_id] [,DISPLAY_NAME=string] [, FILE=string] [, FILTER=string/string array] [,/FIX_FILTER] [, GET_PATH=variable] [, GROUP=widget_id] [, /MULTIPLE_FILES] [,/MUST_EXIST] [, /OVERWRITE_PROMPT] [, PATH=string] [, /READ | , /WRITE] [,RESOURCE_NAME=string] [, TITLE=string] )
例如:
filename=Dialog_Pickfile(Filter=’*.pro’,/Read)
filename=Dialog_Pickfile(Filter=’*.pro’,/Read,/Muitiple)
outfile=Dialog_Pickfile(File=’default.dat’,/Write)
检查返回的名字是否为空。
IDL>IF outfile EQ ‘’ THEN Print,’Whoops!’
2.选择目录名
directory=Dialog_Pickfile(/Directory)
Files=findfile(‘*.dat’,count=numfiles)
此命令返回一个包含所有符合给定文件要求的文件名的字符串数组。这在IDL 程序中用于自动匹配并打开文件的任务中非常有用,或者是在任何时候不知道一个目录下有多少个文件的情况下,用于在该目录下创建一批文件的任务中也是非常有用的。
3.构造文件名Filepath
1.dialog_pickfile
Syntax :Result = DIALOG_PICKFILE( [, DEFAULT_EXTENSION=string] [, /DIRECTORY] [, DIALOG_PARENT=widget_id] [, DISPLAY_NAME=string] [, FILE=string] [, FILTER=string/string array] [, /FIX_FILTER] [, GET_PATH=variable] [, GROUP=widget_id] [, /MULTIPLE_FILES] [, /MUST_EXIST] [, /OVERWRITE_PROMPT] [, PATH=string] [, /READ | , /WRITE] [, RESOURCE_NAME=string] [, TITLE=string] )
Example:
1)file = DIALOG_PICKFILE(/READ, FILTER = '*.pro')
2) ; Allow the user to select a DICOM file.
sFile = DIALOG_PICKFILE(PATH='examplesdata', $
TITLE='Select DICOM Patient File', FILTER='*.dcm')
3)sFolder = DIALOG_PICKFILE(PATH='examples\data', /DIRECTORY, $
TITLE="Choose directory containing DICOM patient data.")
2.ENVI_PICKFILE
函数产生一个提示用户选择文件的对话框。该函数产生的界面和使用ENVI主菜单选择File->Open Image File一样的界面。该函数并不真正的打开文件,它只是以字符串的形式返回用户所选择的全路径文件名。
3.READ_ASCII
Syntax :
Result = READ_ASCII( [Filename] [, COMMENT_SYMBOL=string] [, COUNT=variable] [, DATA_START=lines_to_skip] [, DELIMITER=string] [, HEADER=variable] [, MISSING_VALUE=value] [, NUM_RECORDS=value] [, RECORD_START=index] [, TEMPLATE=value] [, /VERBOSE] )
从txt文件中读取矩阵数据。类似于matlab中的dlmread。
4.file_lines
reports the number of lines of text contained within the specified file or files
返回文件的行数
5.读取Excel文件
用IDL读取的话有下面几种方法。
5.1 Excel文件转存为其他格式,如txt或csv;
推荐CSV(逗号分隔值文件),IDL作为ASCII码文件直接读取解析,快捷方便;
5.2 用IDL的Excel读取补丁来读取,这个是基于COM的,得仔细读下说明;
附扩展功能包。
5.3 用IDL的DataMiner,它是一个开放数据库连接( ODBC )接口,借助它IDL用户可快速访问、查询并管理ODBC兼容数据库,同时也支持Oracle、Informix、Sybase、MS SQL Server等大型商用数据库。
详细调用请参考下面示例代码与注释:
; ;IDL下调用ODBC读取Excel ; PRO Using_ODBC_EXCEL filename =file_dirname(ROUTINE_FILEPATH('Using_ODBC_EXCEL'))+'\data.xlsx' ; 判断是否支持数据库功能 IF DB_EXISTS() EQ 0 THEN BEGIN msg = DIALOG_MESSAGE('不支持ODBC!',/Error) RETURN ENDIF ; 新建数据库对象 oDatabase = OBJ_NEW('IDLdbDatabase') ; 检查当前可用数据类型 sources = oDatabase->GETDATASOURCES() index = WHERE(sources.DATASOURCE EQ 'Excel Files',count) IF count EQ 0 THEN BEGIN msg = DIALOG_MESSAGE('ODBC无法读取Excel Files',/Error) OBJ_DESTROY,oDatabase RETURN ENDIF ;连接数据库 IF ~FILE_TEST(filename) THEN BEGIN msg = DIALOG_MESSAGE('找不到数据库文件!',/Error) OBJ_DESTROY,oDatabase RETURN ENDIF ; 连接到我们指定的数据库文件 oDatabase->CONNECT,DATASOURCE='Excel Files;DBQ='+filename ;连接数据库 oDatabase->GETPROPERTY,IS_CONNECTED = connectStat IF connectStat EQ 0 THEN BEGIN msg = DIALOG_MESSAGE('数据库连接不成功...',/Error) OBJ_DESTROY,oDatabase RETURN ENDIF
;读取数据库内数据,获取数据表 tables = oDatabase->GETTABLES() nTables = N_ELEMENTS(tables) FOR i=0, nTables-1 DO BEGIN ; 操作指定表,注意表名,要加“[]”。 tname = '[' + tables[i].NAME + ']' PRINT, 'table name', tname
oRecordset = OBJ_NEW('IDLdbRecordset',oDatabase,table=tname);, SQL=sqlstr) ; 获取字段信息 oRecordset->GETPROPERTY,field_info = fieldinfo NFileds = N_ELEMENTS(fieldinfo) ;获取数据表中的记录数目 IF oRecordset->MOVECURSOR(/first) THEN BEGIN FOR j=0, NFileds-1 DO BEGIN Value = oRecordset->GETFIELD(j) PRINT, 'Talbe: ' + (fieldinfo.TABLE_NAME)[j] + ', ' + $ 'Filed Name: ' + (fieldinfo.FIELD_NAME)[j] + ', ' + $ 'Value: ', Value ENDFOR WHILE oRecordset->MOVECURSOR(/next) DO BEGIN FOR j=0, NFileds-1 DO BEGIN Value = oRecordset->GETFIELD(j) PRINT, 'Talbe: ' + (fieldinfo.TABLE_NAME)[j] + ', ' + $ 'Filed Name: ' + (fieldinfo.FIELD_NAME)[j] + ', ' + $ 'Value: ', Value ENDFOR ENDWHILE ENDIF ELSE BEGIN ; 一条记录都没有 msg = DIALOG_MESSAGE('数据表无记录',/Infor) OBJ_DESTROY, oRecordset ENDELSE ; 销毁数据库对象 OBJ_DESTROY, oRecordset ENDFOR OBJ_DESTROY,oDatabase END |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-6 10:15
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社