IDL中将文本文件中的数据读入二维数组Data[列,行]函数dlmread

PRO dlmread,file,Data,MaxColumn=MaxColumn
;================================================
;该过程可以将文本文件中的数据读入一个二维数组Data[列,行]
;适用于6.x的版本,其它版本未测试,7.X版本对正则表达式支持不好
;曾用名FileColumnData.pro,为了和Matlab一致,改名为dlmread
;使用函数:IDL>dlmread,File,Data;最大列默认为20列
;使用函数:IDL>dlmread,File,Data,MaxColumn=5;最多读取前5列
;使用函数:IDL>dlmread,File,Data,MaxColumn=50;最多读取前50列
;================================================
;wuxuping(USTC & AIAI)
;Email:539688300@qq.com
;2011-03-29
;=======================================================
IF KEYWORD_SET(MaxColumn) THEN BEGIN
	IF (MaxColumn LT 1) Then begin
		message, 'MaxColumn Must be the positve Integer number.'
	end
	MaxCoL=MaxColumn
	ENDIF else begin
	MaxCoL=20;最大列默认为20列
END
;-----------------------------------------
FTresult = FILE_TEST(File)
if (FTresult NE 1) then begin
message, 'File Not Found!'
endif
;-----------------------------------------
;初始化数据
Data=make_array(1,1,/DOUBLE);文件中没有数据时就返回此值
;-----------------------------------------
fs=fileread(file);
;-----------------------------------------
;最多MaxCoL列nn行
if (n_elements(fs) GT 0) then begin
;-----------------------------------------
FileData=make_array(MaxCoL,n_elements(fs),/DOUBLE)
LineCount=make_array(1,n_elements(fs),/UINT)
;===========================================================
for n=0L,n_elements(fs)-1 DO BEGIN
	LineStr=fs[n];
  	rbool=StringToDoubleArray(LineStr,DoubleArray,Count);
;-----------------------------------------
  if ((rbool eq 1) && (Count GT 0))then begin
  	MinColSet=make_array(2,1,/DOUBLE)
  	MinColSet[0]=MaxCoL;
  	MinColSet[1]=Count;
;-----------------------------------------
   for LC=0L,min(MinColSet)-1 Do begin
   	FileData[LC,n]=DoubleArray[LC];
   endfor
;-----------------------------------------
   LineCount[n]=min(MinColSet)
  endif
;-----------------------------------------
endfor
;===========================================================
validrow=where(LineCount GT 0)
;-----------------------------------------
if (max(LineCount) GT 1)AND(n_elements(validrow) GT 1) then begin
  Data=FileData[0:(max(LineCount)-1),validrow];
endif
;-----------------------------------------
endif
;-----------------------------------------
end
;=======================================================
;==============================================================
;StringToDoubleArray
;==============================================================
Function StringToDoubleArray,DblStr,DoubleArray,Count
;用法IDL>Status=StringToDoubleArray(DblStr,DoubleArray,Count)
;DblStr要转换的字符串,字符串可以是'1.23 ,3.4;0.3  E2.2 afd 3er.7 '
;DoubleArray保存double类型的数组
;Count总共可以提取多少个double类型的数
;返回是否成功的标志
;----------------------------------------------------------------
Count=0
;----------------------------------------------------------------
;先对\t处理一下
Stab=STRSPLIT(DblStr, STRING(9b),/EXTRACT)
str=STRJOIN(Stab, ' ')
Si=STRSPLIT(Str,'[;,: ]',/EXTRACT,/REGEX)
;----------------------------------------------------------------
nn = n_elements(Si)
;----------------------------------------------------------------
if (nn GT 0) then begin
	DoubleValue=findgen(nn)
	LineSize=UINDGEN(nn)
;------------------------------------
	for n=0L,nn-1 DO BEGIN
		valid=IsDoubleString(Si[n])
		if (valid GT 0) then begin
			DoubleValue[n]=fix(Si[n],type=5)
			LineSize[n]=1;
		endif else begin
			DoubleValue[n]=0
			LineSize[n]=0;
		endelse
	endfor
;------------------------------------
	count=total(LineSize);
	index=where(LineSize GT 0)
;------------------------------------
	if (count GT 0) then begin
		DoubleArray=DoubleValue[index]
	endif
;------------------------------------
	return,1
;------------------------------------
endif else begin
	return,0
end
;----------------------------------------------------------------
END
function IsDoubleString,dblstr
;用法IDL>Status=IsDoubleString(dblstr)
;Status=0或1,成功为1,否则为0
;以下识别正确的话,肯定可以使用:
;IDL>DoubleValue=fix(dblstr,type=5)转换为double数字
;--------------------------------------------------------------
Status=1;假设可以转换
;先去掉首尾空格
str = STRTRIM(dblstr,2)
;---------------------------------------------
;查找并去掉末尾的非法字符
pos = STREGEX(str, '([^0-9.eE+-]|[+-.][Ee]|[eE].)')
if pos GT -1 then begin
str=strmid(str,0,pos)
endif
;---------------------------------------------
;转换为ASCII
inputstr = byte(str)
;获取字符个数
nn = n_elements(inputstr)
;---------------------------------------------
;判断第一个字符的合法性
if nn GT 0 then begin
	FirstDoubleStr=byte('+-1234567890.')
	index=where(FirstDoubleStr eq inputstr[0],count)
	if count eq 0 then Status=0
endif else begin
	;如果字符的长度小于1,也不是合法字符
	Status=0
endelse
;---------------------------------------------
;判断第二个字符的合法性
if nn GT 1 then begin
	SecondDoubleStr=byte('1234567890.Ee')
	index=where(SecondDoubleStr eq inputstr[1],count)
	if count eq 0 then Status=0
endif
;---------------------------------------------
;查找字符串中数字的总数,不能小于1
num_total=0
NumberStr=byte('1234567890')
for n=0L,nn-1 DO BEGIN
	count=0;
	index=where(NumberStr eq inputstr[n],count)
	num_total=count+num_total
endfor
if num_total LT 1 then Status=0
;=================================
;后续处理
;if Status eq 1 then begin
;print,fix(dblstr,type=5)
;endif
;=================================
;---------------------------------------------
return,Status
End


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值