注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面朝大海 春暖花开

一点心得,转载本博客文章,请注明转帖,谢谢!

 
 
 

日志

 
 
关于我

中国科学院博士 主要从事遥感机理、定量反演、数据处理以及GIS应用研究。ArcGIS、Envi 、ERDAS、Ecognition软件、IDL语言、6S、SAIL

网易考拉推荐
GACHA精选

IDL中文件的行列数计算  

2012-12-09 18:40:08|  分类: idl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在进行数据处理时,由于某些原因,获取的数据没有相应的头文件,数据的行列数未知。

对于文本文件来说,可以采用IDL中的命令来获取数据的行列数。

tmp= STRSPLIT(file, COUNT = samples)

samples就是一个文件file的列数

File_lines是IDL中内嵌的获取读入数据行列数的函数,其具体代码为

FUNCTION file_lines, filename     OPENR, unit, filename, /GET_LUN     str = ''     count = 0ll     WHILE ~ EOF(unit) DO BEGIN        READF, unit, str        count = count + 1     ENDWHILE     FREE_LUN, unit     RETURN, count   END 
根据此代码我们可以分析IDL是如何计算数据的行数的。
对于一个文件,IDL是逐行读取,然后再逐行放入文件中。
 READF, unit, str       
count = count + 1 
为了验证这个问题,对程序进行修改,当读取一行时,就显示

pro file_lines, filename

   OPENR, unit, filename, /GET_LUN
   str = ''          ;设立空的字符串,只能保存一行数据
   count = 0ll
   WHILE ~ EOF(unit) DO BEGIN
      READF, unit, str
      count = count + 1
     print,count
      print,str
   ENDWHILE
   FREE_LUN, unit
print,count

END

这样,程序每当读取一行时,会列出行数和相应的数据

                     3
     6.00000      7.00000      8.00000      9.00000      10.0000      11.0000
                    4
     12.0000      13.0000      14.0000      15.0000      16.0000      17.0000
                    5
     18.0000      19.0000      20.0000      21.0000      22.0000      23.0000
                    6
     24.0000      25.0000      26.0000      27.0000      28.0000      29.0000
                    7
     30.0000      31.0000      32.0000      33.0000      34.0000      35.0000
                    8
     36.0000      37.0000      38.0000      39.0000      40.0000      41.0000

对于文件中列数的提取函数STRSPLIT,其使用方式为

Result = STRSPLIT( String [, Pattern] [, COUNT=variable] [, ESCAPE=string | , /REGEX [, /FOLD_CASE]] [, /EXTRACT | , LENGTH=variable] [, /PRESERVE_NULL] )


COUNT :Set this keyword to a named variable that will contain the number of matched substrings returned by STRSPLIT. This value will be 0 if either of the String or Pattern arguments is null. Otherwise, it will contain the number of elements in the Result array

来看下面的例子

pro file_lines, filename

   OPENR, unit, filename, /GET_LUN
    str = ''
    READF, unit, str
   tmp = STRSPLIT(str, COUNT = col)
   print,str
   print,col

end

这样输出的str为第一行的数据,而col为该行的列数。

 

FUNCTION read_txt_data_file, infilename
        nlines = FILE_LINES(infilename)     ;file_lines可以获取一个文件的行数

        OPENR, lun1, infilename, /GET_LUN   

        tmp_str = ''                             ;Used to store a line

        READF, lun1, tmp_str                 

       tmp = STRSPLIT(tmp_str, COUNT = col_count)     ;Get columns of the input file

    print,tmp_str,col_count

    POINT_LUN, lun1, 0

    data = FLTARR(col_count, nlines)                            ;Allocate memory

    row_count = 0L
    WHILE ~EOF(lun1) DO BEGIN
        READF, lun1, tmp_str
        IF ~STRCMP(tmp_str, '') THEN BEGIN
            tmp_str_split = STRSPLIT(tmp_str, /EXTRACT)
            data_line = FLOAT(tmp_str_split)
            data[*, row_count] = data_line
            row_count = row_count + 1
        ENDIF       
    ENDWHILE
    FREE_LUN, lun1
    RETURN, data[*, 0 : (row_count - 1)]
END

  评论这张
 
阅读(1406)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017