我一直在使用MATLAB来读取一堆输出文件,并注意到与我在Python中为相同文件编写的读者相比,读取文件的速度相当慢(对于MATLAB,大约为120秒) ,4s for Python on the same set)。这些文件有字母和数字的组合,其中我实际想要的数字在同一行上都有一个唯一的字符串,但文件的其余部分没有真正的模式。有没有更快的方法在MATLAB中读取非均匀格式的文本文件?
我尝试在MATLAB中使用代码分析器来查看花费最多时间的内容,它似乎是strfind
和strsplit
函数。更深入,strfun\private\strescape
似乎是占据约50%的时间的罪魁祸首,由strsplit
函数调用。
我目前正在使用strfind和strsplit的组合,以便在文件中搜索5个特定字符串,然后将其后的字符串转换为double。
lots of text before this
#### unique identifying text here
lots of text before this
sometext X = #####
Y = #####
Z = #####
more text = ######
我正在使用大约以下代码迭代文件,对每个正在找到的数字重复。
fid=fopen(filename)
tline=fgets(fid)
while ischar(tline)
if ~isempty(strfind(tline('X =')))
tempstring=strsplit(tline(13:length(tline)),' ');
result=str2double(char(tempstring(2)));
end
tline=fgets(fid);
end
答案 0 :(得分:2)
我猜这会快一些,但可能不会太多。
s = fileread('texto');
[X,s] = strtok(strsplit(s, "X = "){2}); X = str2num(X);
[Y,s] = strtok(strsplit(s, "Y = "){2}); Y = str2num(Y);
[Z,s] = strtok(strsplit(s, "Z = "){2}); Z = str2num(Z);
显然,这对您的文本示例非常具体。您还没有向我提供有关变量如何更改等的更多信息,因此如果文件不一致等,您可能必须实施try/catch
块。
PS。这是八度语法,允许链接操作。对于matlab,请根据需要将它们拆分为单独的操作。
编辑: ach,没关系,这里也是matlab兼容的。 :)
s = fileread('texto');
C = strsplit(s, 'X = '); [X,s] = strtok(C{2}); X = str2num(X);
C = strsplit(s, 'Y = '); [Y,s] = strtok(C{2}); Y = str2num(Y);
C = strsplit(s, 'Z = '); [Z,s] = strtok(C{2}); Z = str2num(Z);