0

我必须在 Matlab 中编写一个程序,性能非常重要,因为它可以处理很多文件。

我必须找到文件名的最后一个文件扩展名并将其拆分。

例如file.name.tar.gz应该分为file.name.targz

我确定了 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);

我认为第三个是最糟糕的。但是其他方法呢?你能想出比我描述的方法更快的方法吗?

4

2 回答 2

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循环解决方案:0.01秒

我的解决方案优于 findstr 和 strtok 的优点是:a)它只查找一个点,而不是所有点 b)它从字符串的末尾开始(大概大多数文件扩展名将是 2-4 个字母长)。

于 2012-05-14T08:52:41.607 回答
1

内置命令fileparts可以满足您的需要,但可能有很多不必要的开销/错误检查等。如果你看一下 100 左右的行,它确实

ind = find(name == '.', 1, 'last');

ext = name(ind:end);
name(ind:end) = [];

name输入文件名在哪里。这与您的第二个建议非常相似 - 它可能更快或更慢,我还没有完成时间。

于 2012-05-14T09:19:18.970 回答