做测试,离不开的是数据的整理和归档。最近在做相机底片辐射定标的时候得到的一组测试结果,为了测试结果的整齐,测试人员(算我一个)把结果分装在了200多个子文件夹,而这200多个子文件夹又分装在5个不同的上层文件夹中……
5个上层文件夹之一,内含151个子文件夹,和一个说明文档
然后我的任务是,遍历它们,找出其中有缺陷的图片……
上次这活儿三个人干了三天……
想想就害怕……
现在我长记性了。。。我要把重复劳动都推给MATLAB!
话不多说,上代码:遍历文件夹下所有的tif文件
%遍历data_path文件夹下所有文件名中包含keyword的tif文件,并做报表Report.xls
%返回counter是遍历到文件的数目,同时用于递归存档
function counter=ergodic(data_path,counter,keyword)
report_file='Report.xls';%报表名称
data_dir=dir([data_path,'\',keyword,'*.tif']);%获取文件夹中的tif文件名
Item={'序号','路径','文件名'};%生成报表
xlswrite(report_file,Item,1,'A1');%在Excel文件report中的第counter行记录下Item
for k=1:length(data_dir)%遍历data_path文件夹下的tif文件
if ~isempty(strfind(data_dir(k).name,'.tif'))%实际上这步筛选与前面是重复的
counter=counter+1;
Item={counter-1,data_path,data_dir(k).name};%依次是 序号 路径 文件名
xlswrite(report_file,Item,1,['A',num2str(counter)]);%在Excel文件report中的第counter行记录下Item
if mod(counter,100)==1,counter,end%时不时地输出一下,看看进度
end
end
%下面遍历data_path文件夹下的子文件夹
data_dir=dir(data_path);%获取文件结构
for k=1:length(data_dir)
%Windows文件夹下会有两个隐藏文件夹,没什么用,躲开就好
%data_dir(k).name是文件名或者子文件夹名,如果是文件名,则data_dir(k).isdir是false
if data_dir(k).isdir && ~isequal(data_dir(k).name,'.') && ~isequal(data_dir(k).name,'..')
counter=ergodic([data_path,'\',data_dir(k).name],counter,keyword);%递归遍历各子文件夹
end
end
end
使用方法举例:
>> fp='F:\Radiation Calibration\测试数据1';%存放数据的文件夹
>> ergodic(fp,1,'*') %数字1是记录用的参数,可以输入任意大于或等于1的整数,星号是通配符
这样,我们的Report.xls文件就生成好了(结果会在MATLAB的工作目录下),文件中包含着各tif文件的报表,可以读取这个Report,进而操作各个tif。也可以直接把操作写到代码中的“xlswrite(report_file,Item,1,['A',num2str(counter)]);”位置(正是为了这个用法,代码中使用了低效的for循环里反复进出文件操作的方式存储Excel,而没有采用更快捷的矩阵方式进行存储)。追求代码规整的话就先生成Report再读取文件进行操作,这样不容易乱(即只许加不许改原则);对于小型任务则考虑直接在代码里改,乱了点不过更方便,对于非专业非工程性质的软件工作,改代码并不比加代码low。
生成的Report.xls
tips:代码中“xlswrite(report_file,Item,1,['A',num2str(counter)]);”是记录到Excel的函数,其中:
第一个参数report_file是记录到的文件名,不包含路径时默认为MATLAB当前工作路径
第二个参数Item是被记录的内容,cell形式,每个胞元占生成的Excel表格中的一格
第三个参数1是Excel的sheet号,写成数字n时会记录到Excel的“Sheet n”分页中,写成字符串时,Excel会建立一个以该字符串为名字的分页,然后再往里面存东西
最后一个参数是一个字符串,表示起始位置,写成'A1'就会在Excel的'A1'位置起始
【end】