Matlab 如何获取partfile的一部分?

Matlab 如何获取partfile的一部分?,matlab,Matlab,这可能是一个非常简单的问题,但我无法找到一个简单的解决方案 [pathstr,name,ext] = fileparts('/xaaa/Data/Q2/CONUS/2002/PRECIPRATE.20020401.000000.tif') 显然,fileparts给出了/xaaa/Data/Q2/CONUS/2002/ 但我只想访问/xaaa/Data/Q2/CONUS/,不考虑最后一部分 一种方法是简单地计算字母parthstr(1:20)。但是必须有一个优雅的替代方法。一个简单的方法是重复

这可能是一个非常简单的问题,但我无法找到一个简单的解决方案

[pathstr,name,ext] = fileparts('/xaaa/Data/Q2/CONUS/2002/PRECIPRATE.20020401.000000.tif')
显然,
fileparts
给出了
/xaaa/Data/Q2/CONUS/2002/

但我只想访问
/xaaa/Data/Q2/CONUS/
,不考虑最后一部分


一种方法是简单地计算字母parthstr(1:20)。但是必须有一个优雅的替代方法。

一个简单的方法是重复使用
fileparts()


注意:使用tilde
~
只会忽略对
fileparts()
的第二次调用的文件扩展名,因为您不需要扩展名。

获取父文件夹最可靠的方法是使用
“…”
访问所提供文件夹上方的文件夹。这是因为它与是否指定绝对路径或相对路径作为输入无关

parent = fullfile(folder, '..');
在您的情况下,由于您有一个文件名,并且希望获取父文件夹,因此可以添加一个“fileparts”调用以获取直接父文件夹,然后将其传递给上面的文件夹

parent = fullfile(fileparts(filename), '..');
这更为健壮,因为它允许您指定相对文件路径,如
2002/PRECIPRATE.20020401.000000.tif
,如果您多次尝试调用
fileparts
,则可能会失败

如果您只有一个文件名(没有目录,因为您位于文件所在的文件夹中),则可以使用
which
获取文件的绝对路径

parent = fullfile(fileparts(which(filename)), '..');

已经提出了三个答案,但我相信有更好的解决方案。我将使用
regexp
匹配
*(?=/.*)
模式,如下所示:

>> originalPath = '/xaaa/Data/Q2/CONUS/2002/PRECIPRATE.20020401.000000.tif';
>> res = char(regexp(originalPath, '.*(?=/.*/)', 'match'))
res =
/xaaa/Data/Q2/CONUS
如果您需要深入n个级别,只需继续为每个级别添加
*/
,例如

>> res = char(regexp(originalPath, '.*(?=/.*/.*/)', 'match'))
res =
/xaaa/Data/Q2
对于OS agnitic版本,或者如果您的路径包含反斜杠和正斜杠的混合,则可以使用以下正则表达式:
'.*(=[/\].[/\]])
。再一次,要进行多个级别,只需为每个级别添加一个额外的
*[/\\]

与使用
strsplit
fileparts
相比,使用strsplit和
fileparts的好处在于,您不需要迭代任何内容,只需一个简单的正则表达式即可得到答案

关于
-我自己使用这个解决方案很长一段时间动态生成Matlab路径。但是,Matlab有时无法正确处理路径中包含
的文件中的断点。确切地说,如果在这样一个文件中放置一个断点,Matlab将忽略它,除非首先触发另一个断点(该断点不在路径中带有
)的文件中)


它显然也处理相对路径

您不需要
~
。您只需省略最后一个输出参数。
fileparts()
如果传递相对路径,则不会失败,但在进程耗尽基本文件路径后,它可能会返回空字符串。e、 g.
fileparts(``)
只是返回一个空字符串。@gariepy所以是一个无声的失败:)我想这就像著名的一句话“邪恶函数的胜利唯一必要的是好函数返回空字符串。”:)你能包括一个操作系统不可知的版本吗?@Suever,添加了一个与前斜杠匹配的版本,或是背部割伤。这在WIndows上也会很有帮助,而且应该与操作系统无关。如果您有任何问题,请告诉我,
>> res = char(regexp(originalPath, '.*(?=/.*/.*/)', 'match'))
res =
/xaaa/Data/Q2