利用matlab把指定字符串在原位置替换为新的字符串(替换txt文件中的部分数据)

因为需要处理数据文件,涉及到数据的重新排列(主要是换顺序),在网上找了找相关的资料,没见到系统一点的,所以在这里整理和测试一下。


已经知道的问题有以下一些:

问题一:请教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的帮助文件,实现重写有两种办法,一种是替换的内容的长度等于原来一行内容长度的时候,可以精确替换,另一种是替换的内容的长度大于原来一行内容长度的时候,这一行之后的所有行都要重新写。。。。。但是我个人觉得如果把换行符加进去应该就没有这样的限制了。但是这个知识很底层。。。暂时没时间管了。。。

技术点:

  1. feof   Test for end-of-file.
  2. fgetl, fgets
  3. Matlab识别字符串中的数字 http://www.ilovematlab.cn/thread-69483-1-1.html (出处: MATLAB中文论坛 )
  4. a(isstrprop(a,'digit'))是一个很好的办法,用于从字符串中把所有数字取出来
  5. 实现了按位置和按内容的替换后,一般的替换要求应该都是可以满足的了。

  • 12
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值