matlab批量处理excel(CSV)文件数据
批量处理 简介思路
今天是2019-1-29,参加完2019年美国大学生数学建模竞赛,小伙伴都回家了,就我一个人在寝室,太无聊了,就把在比赛中遇到的excel批处理,写一下思路(ps:其实我在比赛中 利用的是SQLServer数据库和matlab相结合的数据处理方法,但是一般情况下遇到的都是matlab对excel数据批处理,所以降低要求写了matlab对excel数据批处理,此思路都是小编凭感觉自己摸索出来的,如有错误欢迎指出)。
今天介绍怎么批量读取excel文件的数据,首选我把excel文件名称分为以下几种情况(全凭个人经验,比如读取图片文件,txt文件思路大同小异,希望我的思路起到抛砖引玉的效果)
三维数组存储方法
1. 有规律的数值型名字
%date:2019-01-29-夜晚
%author:猪猪侠
%邮箱:2377389590@qq.com
clear %清除变量
clc%清屏
filename=dir('*.xlsx');%获取全部的.xlsx文件
n=length(filename);%文件数目
for i=2010:2010+n-1%也就是2010:2014
%思路:声明三维数组储存数据
%[int2str(i),'.xlsx']是为了遍历excel文件
[Num(:,:,i-2010+1),TxT(:,:,i-2010+1),Raw(:,:,i-2010+1)]=xlsread([int2str(i),'.xlsx'])
end
运行结果:
2. 有规律的数值型+相同文本的名字
%date:2019-01-29-夜晚
%author:猪猪侠
%邮箱:2377389590@qq.com
clear %清除变量
clc%清屏
filename=dir('*.xlsx');%获取全部的.xlsx文件
n=length(filename);%文件数目
for i=2015:2015+n-1%也就是2015:2019
%思路:声明三维数组储存数据
%['我是',int2str(i),'.xlsx']拼凑excel名称的字符串是为了遍历excel文件
[Num(:,:,i-2015+1),TxT(:,:,i-2015+1),Raw(:,:,i-2015+1)]=xlsread(['我是',int2str(i),'.xlsx'])
end
运行结果
3. 没有规律的文本的名字
dir函数可以有调用方式为:
dir('.') 列出当前目录下所有子文件夹和文件
dir('D:\Matlab') 列出指定目录下所有子文件夹和文件
dir('*.xlsx') 列出当前目录下符合正则表达式的文件夹和文件
得到的为结构体数组每个元素都是如下形式的结构体:
name -- filename
date -- modification date
bytes -- number of bytes allocated to the file
isdir -- 1 if name is a directory and 0 if not
datenum -- modification date as a MATLAB serial date number
%date:2019-01-29-夜晚
%author:猪猪侠
%邮箱:2377389590@qq.com
clear %清除变量
clc%清屏
filename=dir('*.xlsx');%获取全部的.xlsx文件
n=length(filename);%文件数目
for i=1:n
name=filename(i).name;
[Num(:,:,i),Txt(:,:,i),dict(:,:,i)]=xlsread(['',name,''])%批量读取数据
end
源码:
链接:https://pan.baidu.com/s/1iat-mzAAEmCdK4uPR0GjXQ
提取码:yr2c
matlab对excel数据批处理程序改进
2019-8-7今天是七夕节也是小编的生日,大清早小编在朋友圈吃饱了狗粮,总感觉要写点什么,抽空写写博客散散心。没啥心情学习,高兴的是我收到了QQ邮箱的祝福
坚持人丑多读书的宗旨继续写自己的代码,改进excel批量读入的方法,废话少说思路和代码如下
1.无规律的excel文件名批处理:
思路:dir(‘*.格式’)一股脑读入所有相同的格式,然后对filename的结构体进行操作(具体过程往上翻,excel无规律的处理有dir函数属性的详细介绍)
无论文件名咋样的,爱咋样咋样,对于所有excel进行读入,具有普适性的文件,文件如下
代码如下
%author:zhuweijie
%email:2377389590@qq.com
%date:2019-8-7-早
%对于的excel:无论文件名咋样的,爱咋样咋样,对于所有excel进行读入,具有普适性
clc,clear;
s=what;
p=s.path;%当前文件夹路径
filename=dir([p,'\','*.xlsx']);%拼接路径,读入all文件名
mydata=cell(1,length(filename));%初始文件元胞数组
for i=1:length(filename)
mydata{i}=xlsread(filename(i).name);%导入数据
end
运行效果:成功读入文件和数据
2.有规律的excel文件名批处理:
思路:1、构造文件名
2、路径和文件名字符串拼接
%author:zhuweijie
%email:2377389590@qq.com
%date:2019-8-7-早
%对于的excel:文件名+序号
clc,clear
s=what;
p=s.path;%当前文件夹路径
filename=dir([p,'\','*.xlsx']);%拼接路径,读入all文件名
filenum=length(filename);%文件数目
mydata=cell(1,filenum);%初始文件元胞数组
for k=1:filenum
filename=sprintf('data%02d.xlsx',k);
%构造文件名,注:文件名的读入也可以利用字符串拼接,循环读入
%对于data1.xlsx……data10.xlsx文件构造文件名为:sprintf('data%d.xlsx',k);
mydata{k}=xlsread(filename);%导入数据
end
运行效果:可以循环读入相应的文件名
读入五个excel文件的数据
(注意:苹果、Linux系统的电脑运行实战案例1、2、3、4……程序会出错,给出改进方法:
1、matlab写的路径, 左斜杠要改成右斜杠,
2、xlsread要改成readmatrix,
3、xlswrite改成writecell或者writematrix 具体情况自己help )
实战案例1
2019-5-20今天没事突然想继续更新这篇博客
我首先介绍我在数据处理遇到的问题
1.我这里有93个.csv文件,要按照需求批量处理csv文件数据,然后批量输出excel文件,且文件名不变。
2.每个csv文件如下图所示,第一列的数据和第二列的“ ;”前的数据组成数据,第二列“ ;”后面数据和第三列数据按照要求组成数据
比如:6025和57组成6025.57,
13和290组成13+290/1000=13.29
剩下数据以此规律类推;
3.每一个数据表会有*******作为分割线,分割线前面的数据为需要按照以上方法处理的数据,分割线位置是随机变化的
难点:1.字符串拼接问题(主要涉及num2str,cell2mat,chr,str2double ,find ,isnan等函数)
2.数据文件的批量读入和输出
3. 异常处理try......catch
代码如下:
%author:猪猪侠
%E-mail:2377389590@qq.com
clear %清除变量
clc%清屏
s=what;
p=s.path; %当前目录
filename=dir([p,'\data\','*.csv']);%获取data文件夹下面全部的.csv文件
n=length(filename);%文件数目
for i=1:n
name=filename(i).name;%文件 名称遍历循环
[Num,Txt,Raw]=xlsread([p,'\data\',name]);%读取数据
index=find(isnan(Num(:,1)));
%% ---------对特殊数据表进行处理-----------------------------------------------------------------------------
try%异常出错处理
chr=cell2mat(Raw(1:index(1,1)-1,2));
catch
data1=ones(1,index(1,1)-1);%声明空间
data2=ones(1,index(1,1)-1);%声明空间
for j=1:index(1,1)-1
data1(j)=str2double([num2str(cell2mat(Raw(j,1))),'.',chr(j,1:2)]); %对第一列数据和第二列数据进行字符串拼接
data2(j)=str2double(chr(j,8:9))+str2double(num2str(cell2mat(Raw((j),3))/1000));%对第2列数据和第3列数据进行字符串拼接
end
data=[data1',data2'];%拼接后的数据
xlswrite([p,'\result\',strtok(name,'.'),'.xlsx'],data)%输出特殊数据表
end
%% ---------对符合规范的数据表进行处理-------------------------------------------------------------------------
data1=ones(1,index(1,1)-1);
data2=ones(1,index(1,1)-1);
for j=1:index(1,1)-1
data1(j)=str2double([num2str(cell2mat(Raw(j,1))),'.',chr(j,1:2)]);
data2(j)=str2double(chr(j,8:9))+str2double(num2str(cell2mat(Raw((j),3))/1000));
end
data=[data1',data2'];
xlswrite([p,'\result\',strtok(name,'.'),'.xlsx'],data)
end
数据我已经上传群里欢迎加群获取
实战案例2
前几天在家陪老舅钓鱼,没掉几条,备受打击,所以今天不去了,2019-8-16今天没事干所以继续更新这篇博客,思路如下。
我这里有三个Excel数据文件,文件名称为无序没有规律的
要获取三个Excel文件Data表单的全部数据,拼接在一起,然后共用一个表头,经过分析三个Data数据的列数是一样的,不一样的是行数,这样难点就是怎么动态的获取行数,然后再拼接在一起。
代码如下:
%author:zhuweijie
%email:2377389590@qq.com
%data:2019-08-15
clc,clear;
s=what;
p=s.path;%路径
filename=dir([p,'\data\','*.xlsx']);%总文件名
n=length(filename);%文件个数
for i=1:n
name=filename(i).name;%单个文件名
[Num,TxT,Raw]=xlsread([p,'\data\',name],'data');%读入数据
[row(i),col(i)]=size(Raw);%动态获取数据维度大小
Row=row-2;%去除表头
data(1,:)=Raw(2,:);%设置表头
if 1==i
data(2:sum(Row(i))+1,:)=Raw(3:end,:);%如果第一次(i=1),则从第二行开始到第一个数据维度+1
else
data(sum(Row(1:i-1))+2:sum(Row(1:i))+1,:)=Raw(3:end,:);%如果i>1,从第i-1次数据的下一行(也就是+1)开始到i+1行
end
%ps:i=1的if语句可以直接去掉也可以,为了读者方便理解,所以没有删
end
xlswrite('result.xlsx',data);%输出
代码已经上传群文件
实战案例3
今天是2019-12-28,无聊帮研究生学姐写写代码……废话少说,要求如下
要求
每个excel里面都是要2428A这一列,我看了几个都是ATR 这一列。
92个excel弄成92列,放在一个excel里面
感谢猪猪侠,哈哈哈
%author:猪猪侠
%email:2377389590@qq.com
clc;clear;
s=what;
p=s.path;
file=dir([p,'\data\','*.csv']);%拼接路径,读入all文件名
% delete([p,'\result\','data.xlsx'])
filenum=length(file);%文件数目
data=cell(361,92);
for i=1:filenum
name=file(i).name;%文件 名称遍历循环
[Num,Txt,Raw]=xlsread([p,'\data\',name]);%读取数据
data(:,i)=Raw(:,1214);
end
xlswrite([p,'\result\','data.xlsx'],data)%输出数据表
完整版数据可以百度云下载
链接:https://pan.baidu.com/s/1shhVYq9DUre3Nm7rG3ZXrw
提取码:kxy9
实战 案例4
要求就是根据左边数据处理成右边数据
代码
%author:猪猪侠
%E-mail:2377389590@qq.com
clear %清除变量
clc%清屏
filename=dir([pwd,'\data\','*.csv']);%获取data文件夹下面全部的.csv文件
n=length(filename);%文件数目
for i=1:n
name=filename(i).name;%文件 名称遍历循环
[Num,Txt,Raw]=xlsread([pwd,'\data\',name]);%读取数据
[row,col]=size(Raw);
for j=1:row%每一个表单中行数
index=cell2mat(strfind(Raw(j,1),' '));%strfind(S1,S2)在S1查找S2
char_Raw=char(Raw(j,:));
data(j,:)=[ cellstr(char_Raw( 1:(index(1)-1) )), cellstr(char_Raw( (index(1)+1):index(2))),...
cellstr(char_Raw( (index(2)+1):index(3))),cellstr(char_Raw( (index(3)+1):index(4))),...
cellstr(char_Raw( (index(4)+1):length(char_Raw)))]
clear index
end
xlswrite([pwd,'\result\',strtok(name,'.'),'.xlsx'],data)
end
源码 数据已经上传 群文件,自己获取
实战 案例5
有120个文件上下拼接一个整体数据
其中排序函数:sort_nat
win10+matlab2020b +office2019环境
tic
clc,clear;
warning off
mkdir([pwd,'\result'])
filelist=dir([pwd,'\data\','*.csv']);%总文件名
n=length(filelist);%文件个数
namelist=cell(1,n);
%排序
for j=1:n
namelist{j}=filelist(j).name; %排序
end
sortname=sort_nat(namelist);
for i=1:n
[Num,TxT,Raw]=xlsread([pwd,'\data\',char(sortname(i))]);%读入数据
[row(i),col(i)]=size(Num);%动态获取数据维度大小
Row=row;%去除表头
if 1==i
data(1:sum(Row(i)),:)=Raw(2:end,:);
else
data(sum(Row(1:i-1))+1:sum(Row(1:i)),:)=Raw(2:end,:);
end
end
Data=[TxT;data];
xlswrite([pwd,'\result\','result.xlsx'],Data);%输出
toc
ios电脑+matlab2019b+office2019
tic
clc,clear;
warning off
mkdir([pwd,'\result'])
filelist=dir([pwd,'\data\','*.csv']);%总文件名
n=length(filelist);%文件个数
namelist=cell(1,n);
%排序
for j=1:n
namelist{j}=filelist(j).name; %排序
end
sortname=sort_nat(namelist);
for i=1:n
Num=readmatrix([pwd,'\data\',char(sortname(i))]);%读入数据
[row(i),col(i)]=size(Num);%动态获取数据维度大小
Row=row;%去除表头
if 1==i
data(1:sum(Row(i)),:)=Num(1:end,:);
else
data(sum(Row(1:i-1))+1:sum(Row(1:i)),:)=Num(1:end,:);
end
end
TxT={'Time','id','mass','v:0','v:1','v:2','radius','Points:0','Points:1','Points:2'};
Data=[TxT;num2cell(data)];
writecell(Data,[pwd,'\result\','result.xlsx']);%输出
toc
实战案例5的数据+源码可以加微信号:idmatlab领取
实战案例6
今天是2021年6月24,继续更新博客
要求如下
数据文件是这样的
matlab实现代码,其中sort_nat文件字符串排序的函数可以参考: Matlab对文件名进行自然排序_猪猪侠-CSDN博客_matlab文件名排序
tic
clc,clear;
warning off
filelist=dir([pwd,'\波形输出\','*.csv']);%总文件名
n=length(filelist);%文件个数
namelist=cell(1,n);
%排序
for j=1:n
namelist{j}=filelist(j).name; %排序
end
sortname=sort_nat(namelist);
Data=zeros(1024,n)*NaN;
h=waitbar(0,'计算中,请稍候!');
n=100;
for i=1:n
[Num,TxT,Raw]=xlsread([pwd,'\波形输出\',char(sortname(i))]);%读入数据
Data(:,i)=Num;
str=['计算中',num2str(i/n*100),'%'];
waitbar(i/n,h,str)
end
close(h)
save Data Data
toc
matlab运行处理时间要1个小时左右, 小编觉得无聊尝试用python代码实现此功能,哇,太香了,python只要几分钟,python真香,等小编有空写另一个博客:python怎么批量处理csv、Excel、txt文件敬请期待,需要此次案例matlab代码和数据的请联系小编VX: idmatlab,matlab环境已经搭建好了,之间运行就行了(Mac系统或者linux系统除外,这个可以参考实战案例5的第二个代码和开始介绍的Mac相关事项进行适当修改code)
详细的文件数据和代码已经上传群里
实战案例7
源码:
clc
clear
[file,path]=uigetfile('*.csv');
if file == 0
msgbox('You have not selected any files','Error','error');
return
end
if ~exist([pwd,'\result'],'file')
mkdir([pwd,'\result\']);
end
[Num,TxT,Raw]=xlsread([path,file]);
len=size(Raw,1);
n=0;
for i=1:len
if contains(char(Raw{i,2}),'type=')
idx_start1=strfind(char(Raw{i,3}),'=');
idx_start2=strfind(char(Raw{i,4}),'=');
idx_end2=strfind(char(Raw{i,4}),' ');
n=n+1;
% data(n,1)=str2double(Raw{i,3}(idx_start1+1:end));
% data(n,2)=str2double(Raw{i,4}(idx_start2+1:idx_end2));
data{n,1}=Raw{i,2};
data{n,2}=Raw{i,3}(idx_start1+1:end);
data{n,3}=Raw{i,4}(idx_start2+1:idx_end2);
end
end
for j=1:n
time(j)=str2double(cell2mat(data(j,2)));
hight(j)=str2double(cell2mat(data(j,3)));
end
plot(time,hight,'r-o')
ylabel('Hight')
xlabel('time')
grid minor
title={'type','time','hight'};
Data=[title;data];
xlswrite([path,'result\',strtok(file,'.'),'.xlsx'],Data)
源码数据上传到:好玩的matlab/数据批量处理 - Gitee.com
实战案例8
源码:
clc;clear;close all;
selpath=uigetdir(pwd,'选择文件夹');%选择文件夹
if selpath == 0
msgbox('You have not selected any files','Error'); %如果路径没有选择返回,终止运行
return
end
str_file=strfind(selpath,'\');% 查找选择的文件夹名称索引
file_name=selpath(str_file(end)+1:end);%提取选择的文件夹名称
if ~exist('result','file')%创建文件
mkdir('result')
end
% selpath='.\20um\';
file=dir([selpath,'\*.txt']);%获取当前选择路径下面的所有txt
outData=cell(length(file),2);%声明空间
for j=1:length(file) %循环变量文件名称
data_str=importdata([selpath,'\',file(j).name],'%f'); %读取txt
str1=strsplit(data_str,'RX:AA');%对读取的txt文件进行分割
for i=2:length(str1)
str2=strsplit(str1{i}); %str1再一次分割
%数据解析协议:
data=hex2dec(str2{2})*2^16+hex2dec(str2{3})*2^8+hex2dec(str2{4})*2^0;
if data>2^15
data=data-65536;
end
Data(i-1)=data;
end
outData(j,1)={strtok(file(j).name,'.')};
outData(j,2)=num2cell(mean(Data(2:end-2)));%??????
end
xlswrite([selpath,'\..\result\',file_name,'.xlsx'], outData)%输出
最终效果
获取数据文件可以关注:好玩的Matlab 输入关键字:20211109 就可以领取数据+code
实战案例9
源码
clc;clear;close all;
Time=datestr(now,'yyyy-mm-dd-HH-MM-SS');
folder=dir([pwd,'\data\*.xlsx']);
if ~exist('result','file')
mkdir('result');
end
n=length(folder);
for j=1:n
namelist{j}=folder(j).name;
name_idx_start=strfind(namelist{j},'(');
name_idx_end=strfind(namelist{j},')');
name_num(j)=str2num(namelist{j}(name_idx_start+1:name_idx_end-1));
end
[~,name_idx] = sort(name_num);%名称排序
disp('-------------开始处理-----------------')
for i=1:n
% disp(folder(name_idx(i)).name);
% [Num{i},TxT{i},Raw{i}]=xlsread([pwd,'\data\',folder(name_idx(i)).name]);
[Num,TxT,Raw]=xlsread([pwd,'\data\',folder(name_idx(i)).name]);
for j=1:size(Raw,1)
if strfind(Raw{j,1},'DataValue')
disp(['文件(',num2str(i),')的位置为:',num2str(j)])
loc_idx(i)=j;
Data{i}=Raw(j:end,2:4);
break;
end
end
end
% DataNan=cell(size(Data{1},1),1);
for i=1:size(Data,2)
if i==1
NewData=Data{1};
else
NewData=[NewData,Data{i}] ;
end
end
Title_name=cell(1,size(NewData,2));
for i=1:n
Title_name(1,3*i-1)={strtok(folder(name_idx(i)).name,'.')};
end
Data_all=[Title_name;NewData];
xlswrite([pwd,'\result\',Time,'.xlsx'],Data_all);
disp(['-------------输出成功:【',Time,'.xlsx】-----------------'])
运行结果:
实战案例 9
1、需求要批量处理37 个数据
2、需要获取每个数据的第 4 列和第 8 列
3、获取第 8 列数据的的数据绘图,需要识别获取如下的数据:每个阶梯峰值跳跃时候的最后一个峰值区域数据;
如下图所示
4、将这个第 8 列数据保存下来,同时把对应4列的数据也保存
5、保存的数据为 excel格式且第4列名称规律为:“负荷-+原始文件名称”
第 8 列数据 名称规律“应变-+原始文件名称”
代码
% 公众号:好玩的 MATLAB
% Email:2377389590@qq.com
% 购买链接:https://mbd.pub/o/bread/mbd-ZJmcmJZy
clc;clear;close all;warning off;
tic
erri=0;
file=dir('数据/*.CareD');
% 获取电脑显示屏的大小
screenSize = get(0, 'ScreenSize');
% 计算图形窗口的位置和大小
position = [0,screenSize(4)/2, screenSize(3), screenSize(4)/2];
% 检查文件夹是否存在
if ~exist('应变', 'dir')
% 如果不存在,创建新的文件夹
mkdir('应变')
end
% 检查文件夹是否存在
if ~exist('负荷', 'dir')
% 如果不存在,创建新的文件夹
mkdir('负荷')
end
for n=1:length(file)
name=file(n).name;
disp(['---------------------读取',name,'文件---------------------'])
p=fullfile(file(n).folder,name);
% [Num,Txt,Raw]=xlsread(p);
originData=importdata(p);
Num=originData.data(:,[4,8]);
Num(1:50,:)=[];
Num(Num(:,2)<0.02,:)=[];
x1=Num(:,2);
x2=Num(:,1);
windowSize = 40;
b = (1/windowSize)*ones(1,windowSize);
a = 1;
y = filter(b,a,x1);
try
[maxv,maxl]=findpeaks(y,'minpeakdistance',300);
% maxl(1)=[];
figure('Name',strtok(file(n).name,'.'),'Position', position)
hold on
% plot(y,'k')
plot(x1,'k','LineWidth',1)
idxPx1=maxl-16;
idxPy1=x1(maxl-16);
idxPx1(logical([0;(abs(diff(idxPy1))>40)]))=[];
idxPy1(logical([0;(abs(diff(idxPy1))>40)]))=[];
% idxPx1(logical(idxPy1<0.3))=[];
% idxPy1(idxPy1<0.3)=[];
plot(idxPx1,idxPy1,'ro','MarkerFaceColor','r')
[minv,minl]=findpeaks(-y,'minpeakdistance',300);
% minl(1)=[];
idxPx2=minl-15;
idxPy2=x1(minl-15);
idxPx2(idxPy2>20)=[];
idxPy2(idxPy2>20)=[];
idxPx2(logical([0;(abs(diff(idxPy2))>5)]))=[];
idxPy2(logical([0;(abs(diff(idxPy2))>5)]))=[];
plot(idxPx2,idxPy2,'go','MarkerFaceColor','g')
idxSep=find(diff(idxPy1)>15);
for i=1:length(idxSep)
plot([idxPx2(idxSep(i)),idxPx2(idxSep(i))],[0,100],'LineWidth',2,'LineStyle','-.','Color','m')
disp(['第',num2str(i),'组数据为:',num2str(idxPx2(idxSep(i)-1)),'到',num2str(idxPx2(idxSep(i)))])
data1{i}=x1(idxPx2(idxSep(i)-1):idxPx2(idxSep(i)));
data2{i}=x2(idxPx2(idxSep(i)-1):idxPx2(idxSep(i)));
patch([idxPx2(idxSep(i)-1),idxPx1(idxSep(i)),idxPx2(idxSep(i))],...
[idxPy2(idxSep(i)-1),idxPy1(idxSep(i)),idxPy2(idxSep(i))], ...
'm','FaceAlpha',.2)
end
disp(['第',num2str(i+1),'组数据为:',num2str(idxPx2(end)),'到',num2str(length(x1))])
data1{length(idxSep)+1}=x1(idxPx2(end):length(x1));
data2{length(idxSep)+1}=x2(idxPx2(end):length(x1));
patch([idxPx2(end),idxPx1(end),length(x1)], ...
[idxPy2(end),idxPy1(end),x1(length(x1))], ...
'm','FaceAlpha',.2)
% figure('Name','图2')
for i=1:length(data1)
% xlswrite('data.xlsx',data{i},num2str(i))
% subplot(length(data),1,i)
% plot(data{i})
writematrix(data1{i},['应变/应变-',strtok(file(n).name,'.'),'.xlsx'],'Sheet',i)
writematrix(data2{i},['负荷/负荷-',strtok(file(n).name,'.'),'.xlsx'],'Sheet',i)
end
catch
erri=erri+1;
figure('Name',strtok(file(n).name,'.'),'Position', position)
plot(x)
disp([name ,'数据异常'])
errorFile{erri}=name;
end
clear data1 data2
end
for i=1:erri
sprintf('异常数据有:%s',errorFile{i})
end
fprintf('识别准确度为:%0.4g%%\n',(1-erri/n)*100)
toc
posted on 2020-04-21 11:19 好玩的MATLAB 阅读(88) 评论(0) 编辑 收藏 举报 来源