您的位置:首页 > 其它

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

2011-04-14 13:45 387 查看
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
;
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
=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
)
if (valid GT 0) then begin
DoubleValue
=fix(Si
,type=5)
LineSize
=1;
endif else begin
DoubleValue
=0
LineSize
=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
,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: