我必须在Matlab中编写程序,性能非常重要,因为它处理了大量文件。
我必须找到文件名的最后一个文件扩展名并将其拆分。
e.g。 file.name.tar.gz
应该分为file.name.tar
和gz
我确定了3种方法,但我不知道哪种方法最快。
1
javaFilename = java.lang.String(fileName);
lastDot = javaFilename.lastIndexOf('.');
name = char(javaFilename.substring(0, lastDot-1));
ext = char(javaFilename.substring(lastDot+1));
2
dots = findstr(fileName, '.');
lastDot = dots(length(dots));
name = fileName(1:lastDot-1);
ext = fileName(lastDot+1:end);
3
[name tempExt] = strtok(fileName, '.');
while tempExt
[temp2 tempExt] = strtok(fileName, '.');
if tempExt
name = strcat(name, '.', temp2);
end
end
ext = temp2(2:end);
我认为第三个是最差的。但其他方法怎么样? 你能想出比我描述的方法更快的东西吗?
答案 0 :(得分:2)
您可以通过执行以下操作来测试这些:
tic;
fileName = 'testFileName.ext';
for i=1:100000
<find last dot>
end
toc;
我对你的基准测试,发现第二个更快。
我的解决方案是
for index=length(fileName):-1:1
if (fileName(index) == '.')
break;
end
end
我得到的时间是:
Java解决方案:23秒
findstr解决方案:0.4秒
strtok解决方案:(没有终止;也许我把它复制错了)
反向for-loop解决方案:0.01秒
我的解决方案优于findstr和strtok的优点是: a)它只查找一个点,而不是所有点 b)它从字符串的结尾开始(可能大多数文件扩展名为2-4个字母)。
答案 1 :(得分:1)
内置命令fileparts
可以满足您的需求,但可能不需要进行大量的开销/错误检查等。如果你看一下100左右的线,它就会
ind = find(name == '.', 1, 'last');
ext = name(ind:end);
name(ind:end) = [];
其中name
是输入文件名。这非常类似于你的第二个建议 - 它可能会更快或更慢,我还没有完成时间。