实现替换时,有两种情况,一是原来的那行完全不要,另一种是换掉那酚祯馄嫱行的一部分数据。替换之后输出的主要办法有两个:第一种方法是采用覆盖的办法(适用于数据量特别大,全部读进来内存不够用的情况),溟猫钽吟第二种方法是把所有数据读取出来然后写成新的文件(数据量小的时候特别方便)在MATLAB中文论坛,大家常用的方法都是第二种方法,即先用fopen全部读入,修改完成后,再写到一个新文件。对于大文件,(大于1M以上的文件,或者上G的文件),读整个文件,再写整个文件,比较慢,费时。本经验主要介绍第一种方法的使用。例如:对于下文的字符,要求对指定字符*SECTION_SHELL下面的指定数字ID(加粗的1)的下一行厚度进行整行修改(修改加粗的数字0.8)。文件名为test.txt$HWCOLORCOMPS113geban61185*SECTION_SHELL$HMNAMEPROPS1tube1.5.0120.833350.00.80.80.80.8*SECTION_SHELL$HMNAMEPROPS3gaban1320.833350.00.40.40.40.4
工具/原料
MATLAB
方法/步骤
1、需要读取修改源文件如下图
2、清空空间,输入文件路径,以及ID号,和厚度。clcclearcloseallfilename='D:\thinkpad\Desktop\test.txt';PartID=1;%要修改的ID号newthickness=0.9;%输入修改厚度
3、由于文件中每个字符加上空格是10个字符,所以输入值必须保证10字符,才能与test.txt进行精确查找。也得判断PartID,newthickness是几位。strPartID=num2str(PartID);strnewtemp=num2str(newthickness);LenstrPID=length(strPartID);LenstrTID=length(strnewtemp);forjk=1:10-LenstrPIDstrPartID=['',strPartID];%添加空格,保证只占用10个字符endforjl=1:10-LenstrTIDstrnewtemp=['',strnewtemp];%添加空格,保证只占用10个字符endLenstrPID=length(strPartID);LenstrTID=length(strnewtemp);
4、查找替换主文竭惮蚕斗件。主要使用fgetl,strfind,strcmp,fseek,已经fprintf写函数。用fp鸡堕樱陨rintf函数将strnew替换文件中的”0.80.80.80.8“。程序如下:ifLenstrPID==10&&LenstrTID==10strnew=[strnewtemp,strnewtemp,strnewtemp,strnewtemp];%生成要替换的厚度[fid,errmsg]=fopen(filename,'r+');iffid<0disp(errmsg);disp('不能打开文件');elseflag=1;while(~feof(fid))%|flagtline=fgetl(fid);ifischar(tline);tline=upper(tline);if~isempty(strfind(tline,'*SECTION_SHELL'));%字符串匹配fork=1:2;%将光标移动到PartID行tpart=fgetl(fid);endifstrcmp(strPartID,tpart(1:10));%是否是指定PartIDfseek(fid,0,'cof');%那么找到把光标移到这个字符串前fprintf(fid,'%s',strnew);%flag=0;break;endendendendendfclose(fid);ifflagdisp('k文件中没有厚度或者指定PartID');elsedisp('修改完成');endelsedisp('值占用空间不是10个字节,检查程序')end
5、运行结束后,结果如下图: