有一个点数据文件,格式如下
height =10,width=15696,num=156960
1796.61, -853.93, 0.00, 0.00, 0.00, 0.00
1801.61, -853.93, 0.00, 0.00, 0.00, 0.00
1806.61, -853.93, 0.00, 0.00, 0.00, 0.00
1811.61, -853.93, 0.00, 0.00, 0.00, 0.00
1816.61, -853.93, 0.00, 0.00, 0.00, 0.00
1821.61, -853.93, 0.00, 0.00, 0.00, 0.00
说明:
(1)第一行为文件头,描述了后面的点数据(如height)。参数格式为:key=value 等号左右可能都有空格。
(2)第二行之后的全部为点数据
%
filename='D:\CodeRepo\dotnet\FileXml\FileXml\data\S4-Model.3d';
delimiterIn = ',';
headerlinesIn = 1;
t1=clock;
% 使用importdata导入数据自动将数据分为textdata和data部分。
% textdata用来存放头部信息
% data用来存储矩阵数据
idata = importdata(filename,delimiterIn,headerlinesIn);
[datarow datacol]=size(idata.data);
% 使用正则表达式对第一行参数字符串进行分析。
% 参数格式如:参数名1=参数值1;
% 多个参数之间可以用逗号分隔
pattern='\s*([^\s,]+)\s*=\s*([^\s,]+)[\s]*';
match =regexpi(idata.textdata,pattern,'tokens');
if (isempty(match{1}))
disp('参数行不符合规定格式')
else
[r,c]= size(match{1,1}) ;
disp(['匹配参数数量' c ])
keys=cell(1,c);
values=cell(1,c);
for i=1:c
disp( ['参数名- ' match{1,1}{1,i}{1,1} ' 参数值-' match{1,1}{1,i}{1,2} ])
keys{1,i}= [match{1,1}{1,i}{1,1}] ;
values{1,i}=[match{1,1}{1,i}{1,2}];
end
% 转换成Key/Value,可以用params(key)访问,isKey(params,'A')判断是否存在
params=containers.Map(keys,values);
end
t2=clock;
etime(t2,t1)
height=str2num(params('height'));
width=str2num(params('width'));
num=str2num(params('num'));
% 156960
if height*width ~= num && num~=datarow
disp('点数量和行列不对')
%return
end
% 读取数据,每行表示一个点,转换成struct
%
meshdata=cell(height,width);
t1=clock;
for i=1: height
for j=1:width*datacol
point.x=idata.data(i,1);
point.y=idata.data(i,2);
point.z=idata.data(i,3);
point.a=idata.data(i,4);
point.b=idata.data(i,5);
point.c=idata.data(i,6);
meshdata{i,j}=point;
end
end
t2=clock;
etime(t2,t1)
return