天天看點

matlab讀取idl的變量,科學網—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檔案轉存為其他格式,如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

轉載本文請聯系原作者擷取授權,同時請注明本文來自楊杭科學網部落格。

連結位址:http://blog.sciencenet.cn/blog-346157-886500.html

上一篇:一個可以下載下傳hyperion資料的網站

下一篇:IDL數組操作