利用IDL可以自動獲取文字中一維、二維甚至三維的陣列。當陣列為二維以上時,需要透過方法獲取陣列的行列數等資訊。下面以三維陣列為例,介紹如何使用IDL自動獲取文字中儲存的三維陣列。
對於三維陣列的儲存方式有一定的要求,如圖所示(習慣遙感影像了,就把第三維看成是波段吧,o(∩_∩)o ~)。本次測試未考慮資料型別,大家可參考程式碼進行修改。
圖:測試所用三維陣列及格式說明
程式碼如下:
- Samples – 列數
- Lines – 行數
- Bands – 波段數
PRO TEST_READ_3D_TXT
;檔案路徑,自行修改
file = 'D:\Temp\3維陣列.txt'
;獲取samples。因為有空行,所以不能用FILE_LINES函式。
OPENR, lun, file, /get_lun
WHILE ~EOF(lun) DO BEGIN
str = ''
READF, lun, str
IF STRTRIM(str) NE '' THEN BEGIN
samples = N_ELEMENTS(STRSPLIT(str))
BREAK
ENDIF
ENDWHILE
FREE_LUN, lun
;獲取lines和bands, lines是總行數,除以bands得到每一維的行數。
bands = 1L
lines = 0L
blank = 0
OPENR, lun, file, /get_lun
WHILE ~EOF(lun) DO BEGIN
str = ''
READF, lun, str
IF STRTRIM(str) EQ '' AND blank EQ 1 THEN BEGIN
bands++
blank++
ENDIF ELSE IF STRTRIM(str) NE '' THEN BEGIN
blank = 1
lines++
ENDIF ELSE IF STRTRIM(str) EQ '' AND blank GT 1 THEN BEGIN
blank++
ENDIF
ENDWHILE
FREE_LUN, lun
IF blank GE 2 THEN bands--
PRINT, 'samples: ', samples
PRINT, 'lines: ', lines/bands
PRINT, 'bands: ', bands
;獲取三維陣列Data
Data = INTARR(samples, lines/bands, bands)
OPENR, lun, file, /get_lun
READF, lun, Data
FREE_LUN, lun
PRINT, Data
END
IDL Prints: