Matlab讀取文本數據

有一個點數據文件,格式如下

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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章