用xlsread函数进行数据的提取。
xlsread函数语法:
num = xlsread(filename)
num = xlsread(filename,sheet)
num = xlsread(filename,xlRange)
num = xlsread(filename,sheet,xlRange)
num = xlsread(filename,sheet,xlRange,‘basic’)
[num,txt,raw] = xlsread(___)
___ = xlsread(filename,-1)
[num,txt,raw,custom] = xlsread(filename,sheet,xlRange,‘’
filename:要提取的文件名(也可以是文件路径);num:返回的double型的数据矩阵(字符串类型的数据在该矩阵中显示为NaN);sheet:要提取的表格页数或页名称;xlRange:提取数据的范围,使用Excel 范围语法,例如 ‘A1:C3’;txt:在元胞数组中返回文本字段,数据类型的元素在元胞中为空值;raw:在元胞数组中返回数值数据和文本数据
要处理的表格预览
观察上表格,其中既有文本数据,又有数值数据,所以我们用[num,txt,raw] = xlsread(___)提取表格中数据保证所有的数据都能够被提取。
matlab代码:[num,txt,raw] = xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',2)
提取到表格中的所有数据,我们就可以用矩阵的语法对其进行操作了。可以看到表格中的最后一列中含有作废发票,故我们要将其删除,基本思路是找到第八列所有的“作废发票”返回其的行指标,将这些行删除。
L8 = raw(2:end,8)
tf = strcmp('作废发票',L8);
strcmp函数可以判断字符串数组中的元素是否和给定的字符串完全相同,如果完全相同返回1,否则返回0,tf是一个和L8大小相同的double矩阵。
index = find(tf==1);
%去除作废发票
raw(index+1,:) = [];
find函数可以返回满足括号中关系式的元素的指标,因为我们从第二行开始查找,令index+1行等于[ ],相当于对第index+1行进行删除,删除之后元胞数组的大小也变化。
数据的分类主要有两方面,一方面是公司的分类,另一方面是日期的分类,为了方便,我们将raw的每一列复制给一个变量。
L1 = raw(2:end,1);L2 = raw(2:end,2);L3 = raw(2:end,3);L4 = raw(2:end,4);
L5 = raw(2:end,5);L6 = raw(2:end,6);L7 = raw(2:end,7);L8 = raw(2:end,8);
uni = unique(L1);
unique函数返回字符串数组中所有不同的字符串,因为其为内置的函数,字符串的出现顺序和原数组不同,后面写代码时要注意。
compid = cell(length(uni),1);
for i = 1:length(uni)
tf = strcmp(uni(i),L1);
index = find(tf==1);
compid{i} = index;
end
元胞数组的赋值应使用大括号{ },元胞数组值的提取也使用大括号,使用小括号()返回的是数据类型或一个新的元胞。
Et = cell(length(uni),4*12);
%循环公司的坐标表
for i = 1:length(uni)
for j = [2016 2017 2018 2019];
for k = 1:12
idcp = compid{i};
logbool = strncmp(L3(idcp),sprintf('%d%s%d%s',j,'/',k,'/'),7);
index = find(logbool==1);
Et{i,(j-2016)*12+k} = index;
end
end
end
sprintf函数可以连接数字和字符串组,strncmp函数与strcmp函数类似,但其可以指定匹配的字符串的长度,如上代码规定匹配到前7个字符相同则返回1。
至此我们已经拥有了所有公司的目录,和所有公司对应的不同月份的目录,如何使用这些目录是关键,下来我们简单的绘制一下某一公司的不同月份按时间序列的总金额、总税额的变化曲线。
company = 'E17';
id = find(strcmp(uni,company)==1);
Tolmm = zeros(48,1);%金额,按月来计
Tolsm = zeros(48,1);%税额,按月来计
t1 = [L5{compid{id}}];
t2 = [L6{compid{id}}];
for i = 1:48
Tolmm(i) = sum(t1(Et{id,i}));
Tolsm(i) = sum(t2(Et{id,i}));
end
plot(1:48,Tolmm,'-',1:48,Tolsm,'.-');
legend([company '的发票金额'],[company '的发票税额'],'location','northwest');
xlabel('时间/月');ylabel('金额/元');