IDL读取文本文件中多维数组的方法

今天给大家介绍下怎么用IDL语言读写多维数组。以下面这个三维数组为例

   3585   1368    114     56     52     29     25     14
   3586   1368    111     56     51     28     24     14
   3587   1368    112     54     51     29     24     14
   3588   1368    110     54     49     29     23     12
   3589   1368    110     54     49     28     21     14
   3590   1368    109     54     49     27     22     13


   3591   1368    108     53     47     28     24     14
   3592   1368    107     52     47     28     25     14
   3585   1369    111     56     52     29     25     14
   3586   1369    113     55     51     28     23     12
   3587   1369    114     55     50     28     23     14
   3588   1369    110     54     49     28     22     13


   3590   1369    108     53     49     28     22     14
   3591   1369    107     52     47     28     24     13
   3592   1369    106     52     47     28     24     13
   3585   1370    111     56     51     29     25     14
   3586   1370    112     56     50     28     24     14
   3587   1370    111     54     49     28     23     13

 

首先我们要考虑如果如果我们知道这个文本文件中的数组大小。即这个数组是三维,8列 6行。

那么直接创建数组然后读进来就可以

;samples,lines,bands分别是列、行、维度

data = MAKE_ARRAY(samples,lines,bands,TYPE=1)
  OPENR,lun,filename,/GET_LUN
  READF,lun,data
  FREE_LUN,lun
  PRINT,data

 

但是大多数情况下,在数据量很大的情况下。我们不可能直接读。那么我们要读这个文本文件里面的列,行,和维度。然后才能读取数据。

那么我们来试一下。代码如下

PRO test_BILL_A

  filename = FILE_DIRNAME(ROUTINE_FILEPATH('test_BILL_A'))+$
    '\三维数据.txt' ;读取文件

  ;sample 行数
  ;bands维数
  ;lines 行数
  ;获取sample


  OPENR,lun,filename,/get_lun
  WHILE ~EOF(lun) DO BEGIN
    str = ''
    READF,lun,str  ;读了一行数据
    IF STRTRIM(str) NE ''  THEN BEGIN
      sample = N_ELEMENTS(STRSPLIT(str)) ;读取列数
      BREAK
    ENDIF
  ENDWHILE

FREE_LUN,lun


  ;eof用于判断文件指针的位置,如果在开头结尾返回1,如果在开头返回0
  ;STRSPLIT用于判断字符串之间空格的位置
  ;breakBack语句提供了一种方便的方法,可以立即从循环(for、foreach、while、Repeat)、case或Switch语句中退出,而无需理会Goto语句。
  
 

  bands = 1L
  lines = 0L
  blank = 0
  OPENR,lun,filename,/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: ', sample
  PRINT, 'lines:   ', lines/bands
  PRINT, 'bands:   ', bands

  ;获取数据
  data = MAKE_ARRAY(sample,lines/bands,bands,TYPE=1)
  OPENR,lun,filename,/GET_LUN
  READF,lun,data
  FREE_LUN,lun
  PRINT,data
END

其实还是非常简单的,大家如果对其中的函数不清楚,就去查查文档。相信你会得到答案的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值