请教如何用matlab去读取内容不规则的文本文件的数据

源文件的某个段落如下

%_N_ARTISTEST_MPF
;$PATH=/_N_WKS_DIR/_N__WPD
;PART_NUMBER=
;PART_NAME=
;PROGRAMMED_BY=
;ISSUE_NUMBER=
N2 M27
N4 G40 G00
N6 CUT3DC
MSG(" OPERATION NAME : SET G54 ")
N8 $P_UIFR[1]=CTRANS()
N10 $P_UIFR[1,X,TR]=0
N12 $P_UIFR[1,Y,TR]=0
N14 $P_UIFR[1,Z,TR]=82.5
…………
N62 G01 G54 G90 G94 X25.215 Y53.55 Z1.819 A0. B0. F10800. D1 M07
N64 X76.02 Y169.418 Z-9.25
N66 X68.932 Y172.361
N68 Y162.329
N70 X76.02 Y169.418
N72 X80.263 Y165.175
N74 X84.506 Y160.933
N76 X96.362 Y172.788
N78 X86.848 Y177.66
N80 X77.086 Y182.015
N82 X67.104 Y185.838
N84 X56.932 Y189.121
N86 Y133.359

我需要做的事情是 找出程序中所有的xyz后面的数值(即点的xyz的坐标值),并保存到另外一个文本文件之中,非坐标值外的所有数值和字符都可以忽略。程序中xyz后面的值都为相对坐标值,所以当程序中某行x,y或者z值缺省时,即没有相对坐标移动,其值为0.
本人是matlab初学者,会的东西相当有限,正在一步步地学,谢谢各位的帮助。不好意思 如果可以,请麻烦强人最好能把代码写下来告诉我,因为只是简单的告诉我用什么语句的话我暂时还不能自己解决问题。谢谢。
你好 谢谢你的答案 具体能不能使用我还没有确定 不过其中我有个疑问。
关于你写的这句 if (NumLine<=14) %去掉文件头,因为文件头中含有XYZ会对下面编程造成很大干扰,你这个要修改文件头的行数
因为我没解释清楚 这样是不行的 首先我要读取的这个文件只是一个例子 所有并不一定是14.
然后就是 凡是我要读取的数据 必定是xyz后面立刻接数字 像其他语句中也会出现xyz 但后面并不会马上就是数字而是比如会跟逗号等等 能用程序实现这样的分析吗, 就是只读取xyz后面直接跟数字这些地方。 谢谢

第1个回答  推荐于2016-11-13
%%方法比较笨
fid=fopen('d:\data.txt','r');
NumLine=0;
datax=[];
datay=[];
dataz=[];
while(~feof(fid))
lineinfo=fgetl(fid);%读一行数据
NumLine=NumLine+1;
if (NumLine<=14) %去掉文件头,因为文件头中含有XYZ会对下面编程造成很大干扰,你这个要修改文件头的行数
continue;
end
if (isempty(lineinfo))
continue; %空行,重新读下一行
end

flag=0;

xlocal=findstr(lineinfo,'X'); %假定一行最多只能有一个关键字符X,另外这里是区分大小写的
if (~isempty(xlocal))
xx=sscanf(lineinfo(xlocal:end),'X%f');
flag=1;
else
xx=0;
end

ylocal=findstr(lineinfo,'Y'); %假定一行最多只能有一个关键字符X,另外这里是区分大小写的
if (~isempty(ylocal))
yy=sscanf(lineinfo(ylocal:end),'Y%f');
flag=1;
else
yy=0;
end

zlocal=findstr(lineinfo,'Z'); %假定一行最多只能有一个关键字符X,另外这里是区分大小写的
if (~isempty(zlocal))
zz=sscanf(lineinfo(zlocal:end),'Z%f');
flag=1;
else
zz=0;
end

if (flag==1) %表明至少找到一个XYZ
datax=[datax;xx];
datay=[datay;yy];
dataz=[dataz;zz];
end
end
fclose(fid);

fid=fopen('d:\dataxyz.txt','w');
for i=1:length(datax)
fprintf(fid,'%f\t%f\t%f\r\n',datax(i),datay(i),dataz(i)); %这里用\r\n是方便计算本查看。事实上\n就可以了
end
fclose(fid);

=====================修改版=================
%%逻辑判断比较复杂
fid=fopen('d:\data.txt','r');
NumLine=0;
datax=[];
datay=[];
dataz=[];
while(~feof(fid))
lineinfo=fgetl(fid);%读一行数据
NumLine=NumLine+1;

if (isempty(lineinfo))
continue; %空行,重新读下一行
end

flag=0;

xlocal=findstr(lineinfo,'X'); %假定一行最多只能有一个关键字符X,另外这里是区分大小写的
if (~isempty(xlocal) && ( (lineinfo(xlocal+1)>='0' && lineinfo(xlocal+1)<='9') || lineinfo(xlocal+1)=='-'))
xx=sscanf(lineinfo(xlocal:end),'X%f');
flag=1;
else
xx=0;
end

ylocal=findstr(lineinfo,'Y');%假定一行最多只能有一个关键字符X,另外这里是区分大小写的
if (~isempty(ylocal) && ((lineinfo(ylocal+1)>='0' && lineinfo(ylocal+1)<='9') || lineinfo(ylocal+1)=='-'))
yy=sscanf(lineinfo(ylocal:end),'Y%f');
flag=1;
else
yy=0;
end

zlocal=findstr(lineinfo,'Z');%假定一行最多只能有一个关键字符X,另外这里是区分大小写的
if (~isempty(zlocal) && ((lineinfo(zlocal+1)>='0' && lineinfo(zlocal+1)<='9') || lineinfo(zlocal+1)=='-'))
zz=sscanf(lineinfo(zlocal:end),'Z%f');
flag=1;
else
zz=0;
end

if (flag==1) %表明至少找到一个XYZ
datax=[datax;xx];
datay=[datay;yy];
dataz=[dataz;zz];
end
end
fclose(fid);

fid=fopen('d:\dataxyz.txt','w');
for i=1:length(datax)
fprintf(fid,'%f\t%f\t%f\r\n',datax(i),datay(i),dataz(i)); %这里用\r\n是方便计算本查看。事实上\n就可以了
end
fclose(fid);本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网