我怎样才能获得partfile的一部分?

时间:2016-05-19 20:31:14

标签: 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)。但必须有一个优雅的选择。

3 个答案:

答案 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 版本,或者如果您的路径包含一些反斜杠和正斜杠的混合,您可以使用以下正则表达式:'.*(?=[/\\].*[/\\])'。再次,为了达到几个级别,只需为每个级别添加额外的.*[/\\]

使用strsplitfileparts的好处是你不需要迭代任何东西 - 你可以用一个简单的正则表达式得到答案。

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

它显然也处理相对路径。