有一個點數據文件,格式如下
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