摘要
当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。
原文件
在本文中pdf原文件部分页面如下:
这里的任务是读取目录中的部件名称,其对应的页面,以及某一页中零件的名称,其对应的件号。
预处理为txt
直接读取pdf对MATLAB来说颇为困难,所以我们将pdf手工转为有规律的txt文件。如下图所示:
可以看到我们都是以一行一行的方式列出信息,这有助于matlab中txt操作函数的执行。
还有个小细节就是每隔一定的内容就会以“!”为分界,这有助于MATLAB识别到某一部分已经读完,可以换行了。
代码实现
代码如下:
目录读取函数
function partnp=fun_getnamepagenum(filename)
fid = fopen(filename,'rt');%read text, 'rt'
n= 0; s(find(isspace(s))) = [] %去除所有空格
m=0;
while ~feof(fid) % file operation, end of file
str = fgetl(fid);
str(isspace(str)) = []; %去除所有空格
if isempty(str)
break
end
if str(1)=='!'
m=m+1;
n=0;
continue
end
t=find(str=='.');%
if isempty(t)
break
end
if ~isempty(strfind(str,'0.2'))
partnp{2*m,n+1}=str(1:t(2)-1);
else
partnp{2*m,n+1}=str(1:t(1)-1);
end
if str(end-1)=='-'
partnp{2*m-1,n+1}=str2num(str(end));
else
partnp{2*m-1,n+1}=str2num(str(end-1:end));
end
n=n+1;
end
fclose(fid);
页面读取函数:
function cpfind= fun_getnameidx( filename )
fid = fopen(filename,'rt');%read text, 'rt'
n= 0;%文件行数,
m=0;%第几个小零件
while ~feof(fid) % file operation, end of file
str = fgetl(fid);%读取行
if isempty(str)
break
end
if str(1)=='!'
if n~=0
for i=1:0.5*n
cpfind{m-2,i}= cpfind{m-2,0.5*n+i};
cpfind{m-2,0.5*n+i}=[];
end
end
if length(str)==1;
break
end
if length(str)==2
m=str2num(str(2));
else
m=str2num(str(2:3));
end
n=0;
end
if str(1)~='!'
str(isspace(str)) = []; %去除所有空格
t=find(str=='.');
if isempty(t)
cpfind{m-1,n+1}=str;
elseif t(1)==2&&(str(1)=='0'||str(1)=='1')
cpfind{m-2,n+1}=str(1:t(2)-1);
elseif t(1)==1&&str(2)=='0'
cpfind{m-2,n+1}=str(2:t(3)-1);
elseif t(1)==1&&t(2)>2
cpfind{m-2,n+1}=str(2:t(2)-1);
elseif t(1)==1&&t(2)==2&&t(3)>3
cpfind{m-2,n+1}=str(3:t(3)-1);
elseif t(1)==1&&t(2)==2&&t(3)==3
cpfind{m-2,n+1}=str(4:t(4)-1);
elseif t(1)==1&&t(2)==2&&t(3)==3&&t(4)==4
cpfind{m-2,n+1}=str(5:t(5)-1);
else
cpfind{m-2,n+1}=str(1:t(1)-1);
end
n=n+1;
end
end
fclose(fid);
end
使用时只用在脚本文件中输入填入文件名的函数即可。
结果如下: