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 ;----------------------------------------- File="D:\Desktop\drought_characteristic\2022_output\file\1111.txt" 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翻译一下每行代码
时间: 2023-06-26 08:03:31 浏览: 70
这段代码是一段IDL语言的程序,主要是对一个文件中的数据进行读取和处理。下面是每行代码的翻译:
1. 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 ;
如果传入了参数MaxColumn,则将参数值赋给变量MaxCoL;如果没有传入,则将MaxCoL设为默认值20,表示最大列数为20。如果MaxColumn小于1,则输出错误信息。
2. File="D:\Desktop\drought_characteristic\2022_output\file\1111.txt"
设置变量File为文件路径。
3. FTresult = FILE_TEST(File) if (FTresult NE 1) then begin message, 'File Not Found!' endif ;
通过FILE_TEST函数测试文件是否存在,如果不存在则输出错误信息。
4. Data=make_array(1,1,/DOUBLE);文件中没有数据时就返回此值
初始化一个数组Data,当文件中没有数据时返回这个数组。
5. fs=fileread(file)
使用fileread函数读取文件内容,将文件内容存储在变量fs中。
6. if (n_elements(fs) GT 0) then begin
如果文件不为空,则执行下面的代码。
7. FileData=make_array(MaxCoL,n_elements(fs),/DOUBLE) LineCount=make_array(1,n_elements(fs),/UINT)
创建两个数组FileData和LineCount,FileData用于存储文件中的数据,LineCount用于记录每行数据的列数。
8. for n=0L,n_elements(fs)-1 DO BEGIN
循环读取文件中每一行的数据。
9. LineStr=fs[n]; rbool=StringToDoubleArray(LineStr,DoubleArray,Count);
将每一行数据转换成Double类型的数组,并记录数组的长度。
10. if ((rbool eq 1) && (Count GT 0))then begin MinColSet=make_array(2,1,/DOUBLE) MinColSet[0]=MaxCoL; MinColSet[1]=Count;
如果转换成功且数组长度大于0,则将数组长度Count存储在MinColSet数组的第二个元素中,将最大列数MaxCoL存储在MinColSet数组的第一个元素中。
11. for LC=0L,min(MinColSet)-1 Do begin FileData[LC,n]=DoubleArray[LC]; endfor ;
将Double类型的数组中的数据存储到FileData数组中。
12. LineCount[n]=min(MinColSet)
将这一行数据的列数存储到LineCount数组中。
13. endfor ;
循环结束。
14. validrow=where(LineCount GT 0)
找出LineCount数组中值大于0的元素的下标,存储在validrow数组中。
15. if (max(LineCount) GT 1)AND(n_elements(validrow) GT 1) then begin Data=FileData[0:(max(LineCount)-1),validrow]; endif ;
如果LineCount数组中的最大值大于1且validrow数组中的元素个数大于1,则将FileData数组中对应下标的数据存储到Data数组中。最终返回Data数组。