我有一个大字符串(大约25M个字符),其中我需要替换一个特定模式的多个子字符串。
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中提供多个搜索字符串。
strrep(text,{'Frame 1','Frame 2',..,'Frame 7670'},';')
但是,这将返回一个单元格数组,在每个单元格中,我将原始字符串与相应的子字符串--输入单元格的一个--进行更改。
除了使用regexprep之外,是否有方法替换字符串中的多个子字符串?我注意到它比strrep慢得多,这就是我试图避免它的原因。
使用regexprep,它将是:
regexprep(text,'Frame \d*',';')
对于一个25 to的字符串,替换所有实例需要大约47秒钟。
编辑1:添加等效的regexprep命令
编辑2:添加字符串的大小以供参考,子字符串的出现次数和regexprep的执行时间
发布于 2013-11-15 17:05:44
我认为这可以只用textscan
来完成,这是众所周知的非常快的。指定一个'CommentStyle'
时,'Frame #'
行被去掉。这可能只是因为这些'Frame #'
行位于它们自己的行上才能工作。此代码将原始数据作为一个大向量返回:
s = textscan(text,'%f','CommentStyle','Frame','Delimiter',',');
s = s{:}
您可能想知道每个帧中有多少个元素,甚至想要将数据重新组合成一个矩阵。您可以再次使用textscan
(或前面)来获取第一帧的数据:
f1 = textscan(text,'%f','CommentStyle','Frame 1','Delimiter',',');
f1 = s{:}
实际上,如果您只需要第一行中的元素,可以使用以下命令:
l1 = textscan(text,'%f,','CommentStyle','Frame 1')
l1 = l1{:}
但是,关于textscan
的另一个好处是,您可以使用它直接读取文件(看起来您可能正在使用其他一些方法),只使用fopen
获取一个FID。因此,字符串数据text
不必在内存中。
https://stackoverflow.com/questions/19977984
复制相似问题