因为需要处理数据文件,涉及到数据的重新排列(主要是换顺序),在网上找了找相关的资料,没见到系统一点的,所以在这里整理和测试一下。
已经知道的问题有以下一些:
问题一:请教Matlab数据替换的问题 http://www.ilovematlab.cn/thread-17359-1-1.html (出处: MATLAB中文论坛 )
问题二:Matlab读取文本文件中某的一行,然后用其他内容来替代改行 http://www.ilovematlab.cn/thread-115608-1-1.html (出处: MATLAB中文论坛 )
问题三:matlab怎样用新的字符串替换文件中的字符串,并写在原字符串位置?3Q 百度知道
问题四:Matlab实现替换txt文件中的部分数值的问题 百度知道
问题五:matlab读取txt文件后,如何删掉其中的文本内容 人人网
分析:
实现替换时,有两种情况,一是原来的那行完全不要,另一种是换掉那行的一部分数据。
替换之后输出的主要办法有两个,一个是采用覆盖的办法(适用于数据量特别大,全部读进来内存不够用的情况),一个是把所有数据取出来然后写成新的文件(数据 量小的时候特别方便)
问题一、问题三、问题四是同一类的,从每行的角度来看,都是对一行进行部分替换。
问题二则是一行全部替换。
这四个问题都是读取、替换、输出结合在一起的。我的分析把这些问题分解再合并为两大块,一个是读取与替换,另一个是输出。
问题五实际上问法有问题,从其描述来看,作者只是想要数据文件,文本有没有改动实际上对他要的结果没有影响。所以他的问题很好解决,按行读取然后只读入数据文件即可。这个用Matlab自带的数据导入器,然后直接框选他要的部分即可。
具体实现如下 :
实现读取和替换:
要求一:把数据中的good都换成great
数据:
This is a good example.
This is a nice example.
This is a bad example.
This is a good example.
处理:
clc clear all close all
fid=fopen(‘test.txt’);
count=1;
str=[];
while ~feof(fid)
tline = fgetl(fid);
str{count}=tline;
count=count+1;
end
fclose(fid);
for i=1😦count-1)
str{i}=strrep(str{i},‘good’,‘great’);
end
分析:
使用fgetl读入数据后,用strrep替换即可。这个实现对应单词的替换。
结果:
This is a great example.
This is a nice example.
This is a bad example.
This is a great example.
要求二:把数据的第一列换为其他
数据:
123 234 345
678 456 788
678 567 677
536 777 567
用于替换的数据:A=[1,2,3,4];
处理:
clc clear all close all
fid=fopen(‘test.txt’);
count=1;
str=[];
while ~feof(fid)
tline = fgetl(fid);
str{count}=tline;
count=count+1;
end
fclose(fid);
A=[1,2,3,4];
num=[];
for i=1:(count-1)
count2=1;
numTemp=[];
digitFinder=isstrprop(str{i},‘digit’);
for k=1:length(digitFinder)
if(k>=2&&digitFinder(k)0&&digitFinder(k-1)1)
num(i,count2)=str2num(numTemp);
count2=count2+1;
numTemp=[];
end
if(digitFinder(k)==1)
numTemp=strcat(numTemp,str{i}(k));
end
end
num(i,count2)=str2num(numTemp);
end
for i=1:size(A,2)
num(i,1)=A(i);
end
分析:
这个处理的难点在于把一行的各个数据分离开。我采取的办法是先判断是不是数,然后再写出数据间隔的特点,这样就识别出来了。
具体的替换是很简单的。
结果:
1 234 345
2 456 788
3 567 677
4 777 567
实现输出:
方法一:
数据:
# JSVM Configuration File in AVC mode
#====================== GENERAL ================================================
AVCMode 1 # must be one for AVC simulations
InputFile news_qcif.yuv # input file
OutputFile test.264 # bitstream file
ReconFile enc.yuv # reconstructed file
SourceWidth 176 # input frame width
SourceHeight 144 # input frame height
FrameRate 30.0 # frame rate [Hz]
FramesToBeEncoded 256 # number of frame
处理:
clc clear all close all
fidin1=fopen(‘test.txt’,‘r+’);% 需要读取的文件
i=0;
while ~feof(fidin1)
tline=fgetl(fidin1);%读取一行
i=i+1;
%fprintf(fidout,’%s\n’,tline);
newtline{i}=tline;
if i==6
%如果读到第六行,文件中的第六行中的 enc 替换为news_qcif
newtline{i}=strrep(tline,‘enc’,‘news_qcif’);%替换的函数
end
end
fclose(fidin1);
%%重新以写的形式打开,写入覆盖原来的内容
fidin1=fopen(‘test.txt’,‘w+’)
for j=1:1:i-1
fprintf(fidin1,’%s\n’,newtline{j})
end
fclose(fidin1)
分析:用fprintf的w功能来整个重写,和输出为另一个文件没有本质区别
结果:
# JSVM Configuration File in AVC mode
#====================== GENERAL ================================================
AVCMode 1 # must be one for AVC simulations
InputFile news_qcif.yuv # input file
OutputFile test.264 # bitstream file
ReconFile news_qcif.yuv # reconstructed file
SourceWidth 176 # input frame width
SourceHeight 144 # input frame height
FrameRate 30.0 # frame rate [Hz]
方法二:修改原文件
数据与处理:
2 11 7 14 3 10 6 15 54 45 38 35 55 55 55 5 clc clear all close all
replaceLine = 3;
myformat = ‘%5d %5d %5d %5d\n’;
newData = [33 33 33 33];
% move the file position marker to the correct line
fid = fopen(‘test.txt’,‘r+’);
for k=1:(replaceLine-1);
fgetl(fid);
end
% call fseek between read and write operations
fseek(fid, 0, ‘cof’);
fprintf(fid, myformat, newData);
fclose(fid);
分析:
用了fseek函数。注意数据的每一行的空格很整齐,也就是那里也占了位置的,所以才换成功。
结果:
2 11 7 14
3 10 6 15
33 33 33 33
55 55 55 5
说明:根据Matlab的帮助文件,实现重写有两种办法,一种是替换的内容的长度等于原来一行内容长度的时候,可以精确替换,另一种是替换的内容的长度大于原来一行内容长度的时候,这一行之后的所有行都要重新写。。。。。但是我个人觉得如果把换行符加进去应该就没有这样的限制了。但是这个知识很底层。。。暂时没时间管了。。。
技术点:
- feof Test for end-of-file.
- fgetl, fgets
- Matlab识别字符串中的数字 http://www.ilovematlab.cn/thread-69483-1-1.html (出处: MATLAB中文论坛 )
- a(isstrprop(a,'digit'))是一个很好的办法,用于从字符串中把所有数字取出来
- 实现了按位置和按内容的替换后,一般的替换要求应该都是可以满足的了。
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"> <use xlink:href="#csdnc-thumbsup"></use> </svg><span class="name">点赞</span> <span class="count">8</span> </a></li> <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-Collection-G"></use> </svg><span class="name">收藏</span></a></li> <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true"> <use xlink:href="#icon-csdnc-fenxiang"></use> </svg>分享</a></li> <!--打赏开始--> <!--打赏结束--> <li class="tool-item tool-more"> <a> <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg> </a> <ul class="more-box"> <li class="item"><a class="article-report">文章举报</a></li> </ul> </li> </ul> </div> </div> <div class="person-messagebox"> <div class="left-message"><a href="https://blog.csdn.net/u013614126"> <img src="https://profile.csdnimg.cn/2/E/9/3_u013614126" class="avatar_pic" username="u013614126"> <img src="https://g.csdnimg.cn/static/user-reg-year/2x/6.png" class="user-years"> </a></div> <div class="middle-message"> <div class="title"><span class="tit"><a href="https://blog.csdn.net/u013614126" data-report-click="{"mod":"popu_379"}" target="_blank">CoderHustlion</a></span> </div> <div class="text"><span>发布了189 篇原创文章</span> · <span>获赞 95</span> · <span>访问量 66万+</span></div> </div> <div class="right-message"> <a href="https://bbs.csdn.net/topics/395525879" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板 </a> <a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a> </div> </div> </div>