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 
发布了30 篇原创文章 · 获赞 4 · 访问量 7460

猜你喜欢

转载自blog.csdn.net/guo1wu3shi4/article/details/104528334