首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Matlab中用strrep替换多个子字符串

在Matlab中用strrep替换多个子字符串
EN

Stack Overflow用户
提问于 2013-11-14 12:44:00
回答 3查看 9.1K关注 0票数 2

我有一个大字符串(大约25M个字符),其中我需要替换一个特定模式的多个子字符串。

代码语言:javascript
运行
复制
Frame 1
0,0,0,0,0,1,2,34,0
0,1,2,3,34,12,3,4,0

...........

Frame 2
0,0,0,0,0,1,2,34,0
0,1,2,3,34,12,3,4,0

...........

Frame 7670
0,0,0,0,0,1,2,34,0
0,1,2,3,34,12,3,4,0

...........

我需要删除的子字符串是“Frame#”,它发生在7670次左右。我可以使用单元格数组在strrep中提供多个搜索字符串。

代码语言:javascript
运行
复制
strrep(text,{'Frame 1','Frame 2',..,'Frame 7670'},';')

但是,这将返回一个单元格数组,在每个单元格中,我将原始字符串与相应的子字符串--输入单元格的一个--进行更改。

除了使用regexprep之外,是否有方法替换字符串中的多个子字符串?我注意到它比strrep慢得多,这就是我试图避免它的原因。

使用regexprep,它将是:

代码语言:javascript
运行
复制
regexprep(text,'Frame \d*',';')

对于一个25 to的字符串,替换所有实例需要大约47秒钟。

编辑1:添加等效的regexprep命令

编辑2:添加字符串的大小以供参考,子字符串的出现次数和regexprep的执行时间

EN

Stack Overflow用户

回答已采纳

发布于 2013-11-15 17:05:44

我认为这可以只用textscan来完成,这是众所周知的非常快的。指定一个'CommentStyle'时,'Frame #'行被去掉。这可能只是因为这些'Frame #'行位于它们自己的行上才能工作。此代码将原始数据作为一个大向量返回:

代码语言:javascript
运行
复制
s = textscan(text,'%f','CommentStyle','Frame','Delimiter',',');
s = s{:}

您可能想知道每个帧中有多少个元素,甚至想要将数据重新组合成一个矩阵。您可以再次使用textscan (或前面)来获取第一帧的数据:

代码语言:javascript
运行
复制
f1 = textscan(text,'%f','CommentStyle','Frame 1','Delimiter',',');
f1 = s{:}

实际上,如果您只需要第一行中的元素,可以使用以下命令:

代码语言:javascript
运行
复制
l1 = textscan(text,'%f,','CommentStyle','Frame 1')
l1 = l1{:}

但是,关于textscan的另一个好处是,您可以使用它直接读取文件(看起来您可能正在使用其他一些方法),只使用fopen获取一个FID。因此,字符串数据text不必在内存中。

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19977984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档