Matlab批处理
在数据处理中,通常有很多文件需要处理,而这些文件基本都很相似,比如说是矩阵,它们是相同维数的矩阵,一个一个的处理浪费很多时间,因此需要批处理文件,下面是其中一个方法:在一个文件夹中有21个文件,名字都有规律。
readfile={'D:\单点和单体型\CEU5=0.01\chr1.dat',
'D:\单点和单体型\CEU5=0.01\chr2.dat',
'D:\单点和单体型\CEU5=0.01\chr3.dat',
'D:\单点和单体型\CEU5=0.01\chr4.dat',
'D:\单点和单体型\CEU5=0.01\chr5.dat',
'D:\单点和单体型\CEU5=0.01\chr6.dat',
'D:\单点和单体型\CEU5=0.01\chr7.dat',
'D:\单点和单体型\CEU5=0.01\chr8.dat',
'D:\单点和单体型\CEU5=0.01\chr9.dat',
'D:\单点和单体型\CEU5=0.01\chr10.dat',
'D:\单点和单体型\CEU5=0.01\chr11.dat',
'D:\单点和单体型\CEU5=0.01\chr12.dat',
'D:\单点和单体型\CEU5=0.01\chr13.dat',
'D:\单点和单体型\CEU5=0.01\chr14.dat',
'D:\单点和单体型\CEU5=0.01\chr15.dat',
'D:\单点和单体型\CEU5=0.01\chr16.dat',
'D:\单点和单体型\CEU5=0.01\chr17.dat',
'D:\单点和单体型\CEU5=0.01\chr18.dat',
'D:\单点和单体型\CEU5=0.01\chr19.dat',
'D:\单点和单体型\CEU5=0.01\chr20.dat',
'D:\单点和单体型\CEU5=0.01\chr21.dat'
}
writefile={'D:\单点和单体型\CEU5=0.01\chr1.txt',
'D:\单点和单体型\CEU5=0.01\chr2.txt',
'D:\单点和单体型\CEU5=0.01\chr3.txt',
'D:\单点和单体型\CEU5=0.01\chr4.txt',
'D:\单点和单体型\CEU5=0.01\chr5.txt',
'D:\单点和单体型\CEU5=0.01\chr6.txt',
'D:\单点和单体型\CEU5=0.01\chr7.txt',
'D:\单点和单体型\CEU5=0.01\chr8.txt',
'D:\单点和单体型\CEU5=0.01\chr9.txt',
'D:\单点和单体型\CEU5=0.01\chr10.txt',
'D:\单点和单体型\CEU5=0.01\chr11.txt',
'D:\单点和单体型\CEU5=0.01\chr12.txt',
'D:\单点和单体型\CEU5=0.01\chr13.txt',
'D:\单点和单体型\CEU5=0.01\chr14.txt',
'D:\单点和单体型\CEU5=0.01\chr15.txt',
'D:\单点和单体型\CEU5=0.01\chr16.txt',
'D:\单点和单体型\CEU5=0.01\chr17.txt',
'D:\单点和单体型\CEU5=0.01\chr18.txt',
'D:\单点和单体型\CEU5=0.01\chr19.txt',
'D:\单点和单体型\CEU5=0.01\chr20.txt',
'D:\单点和单体型\CEU5=0.01\chr21.txt'
}
a=char(readfile);
b=char(writefile);
for i=1:21
read=importdata(a(i,:));
for j=1:200
for k=1:80
if rem(k,2)==1
c(j,k)=read(2*j-1,(k+1)/2);
else
c(j,k)=read(2*j,k/2);
end
end
end
write=fopen(b(i,:),'w');
[m,n]=size(c);
for i=1:1:m
for j=1:1:n
if j==n
fprintf(write,'%g\n',c(i,j));
else
fprintf(write,'%g\t',c(i,j));
end
end
end
fclose(write);
end
另外方法如下:
把文件夹下的文件名字放在一个EXCEL文件中,导入matlab,命名为a
for i=1:21
b{i}=importdata(a{i});
end
b(1)
ans =
[400x40 double]
b(i)就是其中的第I个矩阵,然后我们可以对其处理分析,同理,输出的文件我们也可以放在一个EXCEL文件中,然后导入matlab
关于这类问题,网上还有很多方法,但是我都没看明白:搜集一下,以后解决把
问题1:[我编写了一个matlab程序,每次对一个数据文件(.txt数据文件已load保存为mat文件).处理一遍得一个结果.但是有多个数据文件待处理,这样一遍一遍地输入执行然后得到结果,很麻烦,也很浪费时间.请问如何一次性批处理这多个数据文件得到相应的结果??
回答:
先ctrl+a再按F2
命名为XX(i).mat
for i=1:100
load strcat('XX(',num2str(i),').mat'');
end
%strcat是全并string
Re:【讨论】matlab怎样批处理来读取excel格式的数据
for i=9:1:18
proj_header = 'UGO_0';
proj_number = num2str(i);
proj_suffix = '.xls';
if (i<10)
filename = [proj_header '0' proj_number proj_suffix];
else
filename = [proj_header proj_number proj_suffix];
end
data = xlsread(filename);
end
考虑一个文件件内有n个同一属性的数据文件,每个文件代表不同的年份,怎么对于这些文件进行统计整理?
下面是代码:
输入,比如在某文件夹内有n个txt或是dat等格式的文件,现在要一次性读入matlab:
%method 1:
cd f:\xxx %xxx即是文件所在文件夹。
dat=struct2cell(dir);
for i=1:length(dat)-2
data{i}=importdata(dat{1,i+2}); %使用元胞数组存储各文件中的内容。
end
%method 2:
dat1=dir('f:\data');
for i=1:length(dat1)-2
data1{i}=importdata(dat1(i+2).name);
end
多文件的输出:
考虑这个问题,我们必须先生成一个可以产生连续整数序列的函数生成注入001、002、003、……、999
类似整数。
我写了一个,作为参考:
function b=fullnum(n)
if n~=floor(n)||n<=0||n>9999
fprintf('Error:The number is not allowed float-point,less than 0 or larger than 9999!\n');
return;
end
b={};
for i=1:n
if i<10^floor(log10(n))
b{i}=strcat(char(ones(1,floor(log10(n))-floor(log10(i)))*48),int2str(i));
else
b{i}=int2str(i);
end
end
end
下面使用类似这个的模板,存储一个元胞数组的内容到一系列连续文件名的文件:
mkdir F:\data
name=fullnum(41);
for i=1:41
a=data{i};
save(strcat('F:\data\data',name{i},'.txt'),'a','-ascii');
end
%该程序实现了数据文件的批处理,并将处理后的文件以CL_name存储在相同文件夹中。
%对数据的处理为:每隔k步提取一组数据,将提取的数据写入文件存储
%
%2007.4.6 wangbo E-mail:wboboer@163.com
%-------------------------------------------------------------------------%
clear
%提取间隔
k=4;
%导入原始数据
cd('D:\Program Files\MATLAB\R2006a\new');%待处理的数据文件所在文件夹
Allname=struct2cell(dir); %得到上述文件夹下的所有文件名
%dir命令,可以得到路径内包括文件名在内的文件信息,为struc数据结构。
%-------------------------------------------------------------------------%
%逐个读入文件
[m,n]=size(Allname);
for i=3:n%前两个不是文件名
name=Allname{1,i};
Imdata=importdata(name);
%-------------------------------------------------------------------------%
Bdata=Imdata.data;
textdata=Imdata.textdata;
colheaders=Imdata.colheaders;
clear Imdata
%简化变量名
%-------------------------------------------------------------------------%
%数据提取
B_tiqu=Bdata([1:k:end],:);
%-------------------------------------------------------------------------%
%数据输出
t1=cell2mat(textdata(1,1));
t2=cell2mat(textdata(2,1));
c=cell2mat(colheaders(1,:));
%保存文件重命名为CL_name
qianzhui='CL_';
name=[qianzhui,name];
%数据写入
%表头文字部分
f=fopen(name,'wt','n','ASCII');%创建并打开文件
fprintf(f,t1);
fprintf(f,'\n');
fprintf(f,t2);
fprintf(f,'\n');
fprintf(f,c);
fprintf(f,'\n');
clear t1 t2 c qianzhui name
%数据部分
M=length(B_tiqu);
for i=1:M
fprintf(f,'%d %d %d %d',B_tiqu(i,:));%输出格式类似C语言,可自己调整
fprintf(f,'\n');
end%for i=1:M
fclose(f);%关闭文件
end %for i=3:n
%---------------------END-------------------------------------------------%
for i=1:n
fout=sprintf('%03d.fits',i); load(fout); end 问题5:[大量数据文件的输入输出的批处理问题(matlab)[原]
|
大量数据文件的输入输出的批处理问题(matlab)[原]
面对最近几年数据题越来越多,很多朋友都会问“批处理”怎么做,下面就基于matlab的输入输出函数,写一些个人看法。我们以2005年的C题为例(C2005data)先说说这个数据的文件夹结构,X:\C2005data\FORECAST\下面有330个文件,328个数据文件,2个网格文件表示精度、维度;X:\C2005data\MEASURING内有41个数据文件。可能我是学气象学的,对于这个数据比较敏感,也积累了一些处理经验。
【下面的话引自原文】【BEGIN】
FORECAST中的文件lon.dat和lat.dat分别包含网格点的经纬度,其余文件名为<f日期i>_dis1和<f日期i>_dis2,例如f6181_dis1中包含2002年6月18日晚上20点采用第一种方法预报的第一时段数据(其2491个数据为该时段各网格点的雨量),而f6183_dis2中包含2002年6月18日晚上20点采用第二种方法预报的第三时段数据。MEASURING中包含了41个名为<日期>.SIX的文件,如020618.SIX表示2002年6月18日晚上21点开始的连续4个时段各站点的实测数据(雨量),这些文件的数据格式是:
站号 纬度 经度 第1段 第2段 第3段 第4段
58138 32.9833 118.5167 0.0000 0.2000 10.1000 3.1000
58139 33.3000 118.8500 0.0000 0.0000 4.6000 7.4000
58141 33.6667 119.2667 0.0000 0.0000 1.1000 1.4000
58143 33.8000 119.8000 0.0000 0.0000 0.0000 1.8000
58146 33.4833 119.8167 0.0000 0.0000 1.5000 1.9000
【END】
i.现在我们就来处理这个数据读取问题(为方便起见,经纬度数据没读取):
%method 1:
clear,clc
cd E:\data_space\C2005data\FORECAST\ %文件所在文件夹。
dat=struct2cell(dir); %建立文件夹的树结构
for i=1:length(dat)-2 %减去2是由dos文件夹的组织决定的,这里不做解释
data{i}=importdata(dat{1,i+2}); %使用元胞数组存储各文件中的内容。
end
结果如下:data{1}(f6181_dis1文件)
ans =
0.0310 0.0321 0.0313 0.0307 0.0309 0.0331 0.0314 0.0336...
0.0302 0.0310 0.0315 0.0319 0.0330 0.0336 0.0335 0.0334...
......
上面也可以考虑使用结构体数组或元胞数组把文件名和寄存数据的元胞数组进行合并,使得文件信息直观化。
%method 2:
clear,clc
cd E:\C2005data\MEASURING\ %文件所在文件夹。
dat=dir('E:\C2005data\MEASURING\'); %读取文件名,同时dat也是寄存文件名的结构体
for i=1:length(dat)-2
data{i}=importdata(dat(i+2).name); %元胞data即寄存了文件夹中的所有文件数据
end
结果如下:
ans =
1.0e+004 *
5.8138 0.0033 0.0119 0 0 0 0.0002
5.8139 0.0033 0.0119 0 0 0 0
…………
接下来,我们只需对于元胞或结构体操作就可以达到目的了。
ii.多文件的输出:
考虑这个问题,我们必须先生成一个可以产生连续整数序列的函数生成注入001、002、003、……、999类似整数。
我写了一个,作为参考:
function b=fullnum(n)
if n~=floor(n)||n<=0||n>9999
fprintf('Error:The number is not allowed float-point,less than 0 or larger than 9999!\n');
return;
end
b={};
for i=1:n
if i<10^floor(log10(n))
b{i}=strcat(char(ones(1,floor(log10(n))-floor(log10(i)))*48),int2str(i));%生成文件名序列;
else
b{i}=int2str(i);
end
end
end
下面使用类似这个的模板,存储一个元胞数组的内容到一系列连续文件名的文件:
mkdir F:\data %需要输出的文件夹
name=fullnum(41); %输出文件的个数
for i=1:41
a=data{i};
save(strcat('F:\data\data',name{i},'.txt'),'a','-ascii');
end
iii.格式输出问题
上面的程序是不可以格式输出的,matlab中是什么形式,文件就是什么形式,但有时我们不得不采取格式输出的原则,下面提供一个程序:
原始文件结构:
data =
1.0e+004 *
Columns 1 through 8
0.1971 0.0001 1.0240 0.0038 -0.0042 0.0040 0 0.0001
0.1971 0.0002 1.0219 0.0039 -0.0028 0.0046 0 0.0001
......
data=importdata('E:\Data_Space\beijing.mat');
%data1,2---年月
%data3---气压(hPa)
%data4---风速(m/s)
%data5---气温(`C)
%data6---相对湿度(%)
%data7---降水量(mm)
%data8---平均日照百分率(%)
%data9---地表总辐射月均值(MJ/d)
%data10---大气上届天文辐射月均值(MJ/d)
data(:,[3 4 5 7])=0.1*data(:,[3 4 5 7]); %数据不寄存小数,需要对部分列进行预处理
data(:,6)=0.01*data(:,6);
format='%d %2d %10.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n';
fid = fopen('E:\exp.txt','wt');
fprintf(fid,format,data');
fclose(fid)
这个程序自己看matlab帮助,不予以解释。
输出在E:\exp.txt中的文件格式
年 月 气压 风速 气温 相对湿度 降水量 百分率 总辐射 天文
1971 1 1024.035 3.810 -4.242 0.399 0.000 0.702 9.873 15.968
1971 2 1021.914 3.864 -2.836 0.462 0.000 0.565 10.981 21.236
…………