現總結幾個現在用到的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數組操作