青未了分享 http://blog.sciencenet.cn/u/yanghang

博文

IDL读取数据

已有 15236 次阅读 2015-4-30 20:04 |个人分类:IDL学习笔记|系统分类:科研笔记

   现总结几个现在用到的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文件转存为其他格式,如txtcsv

推荐CSV(逗号分隔值文件)IDL作为ASCII码文件直接读取解析,快捷方便;

5.2 IDLExcel读取补丁来读取,这个是基于COM的,得仔细读下说明;

附扩展功能包。

5.3 IDLDataMiner,它是一个开放数据库连接( ODBC )接口,借助它IDL用户可快速访问、查询并管理ODBC兼容数据库,同时也支持OracleInformixSybaseMS 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




https://blog.sciencenet.cn/blog-346157-886500.html

上一篇:一个可以下载hyperion数据的网站
下一篇:IDL数组操作
收藏 IP: 150.229.195.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-6 10:15

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部