这可能是一个非常简单的问题,但我无法找到直接的解决方案。
[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)。但必须有一个优雅的选择。
答案 0 :(得分:1)
获取父文件夹最强大的方法是使用'..'
访问提供的文件夹上方的文件夹。这是因为它与您是指定绝对路径还是相对路径无关。
parent = fullfile(folder, '..');
在您的情况下,由于您有一个文件名并且想要获得父文件,因此您可以添加一个' fileparts'调用它来获取直接父文件夹,然后将其传递给上面的文件夹。
parent = fullfile(fileparts(filename), '..');
这更加强大,因为它允许您指定相对文件路径,例如2002/PRECIPRATE.20020401.000000.tif
,如果您尝试多次调用fileparts
,可能会失败。
如果您只有文件名(没有目录,因为您在文件所在的文件夹中),您可以使用which
获取文件的绝对路径。
parent = fullfile(fileparts(which(filename)), '..');
答案 1 :(得分:0)
一种简单的方法是重复使用fileparts()
:
>> [pathstr,name,ext] = fileparts('/xaaa/Data/Q2/CONUS/2002/PRECIPRATE.20020401.000000.tif');
>> [parent_pathstr, name, ~] = fileparts(pathstr)
parent_pathstr =
/xaaa/Data/Q2/CONUS
name =
2002
注意:使用代字号~
只会忽略第二次调用fileparts()
的文件扩展名,因为您不希望延期。
答案 2 :(得分:0)
已经提出了三个答案,但我相信这是一个更好的解决方案。我会使用.*(?=/.*/)
匹配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-agnistic 版本,或者如果您的路径包含一些反斜杠和正斜杠的混合,您可以使用以下正则表达式:'.*(?=[/\\].*[/\\])'
。再次,为了达到几个级别,只需为每个级别添加额外的.*[/\\]
。
使用strsplit
和fileparts
的好处是你不需要迭代任何东西 - 你可以用一个简单的正则表达式得到答案。
关于..
- 我自己使用这个解决方案很长时间来动态生成Matlab路径。但是,Matlab有时无法在路径中..
的文件中正确处理断点。确切地说,如果你在这样的文件中放置一个断点,Matlab会忽略它,除非有另一个先断开的断点(它不在路径中..
的文件中)。
它显然也处理相对路径。