2013-12-20 120 views
0

因此,我有一個包含數千個文件的文件夾,所有文件都有系統名稱。我希望用戶能夠選擇一個文件夾,之後所有文件名都從列表(單元格數組)轉換爲某種樹結構。然而,實施如何在Matlab中存儲這是我卡住的地方。這是我迄今所做的:從系統字符串(文件名)列表創建部分字符串的樹

folder = uigetdir; 
files = dir([folder '\*.nii']); 
nfiles = length(files); 

filez = cell(nfiles, 1); 
for file = 1:nfiles 
    filez(file,:) = cellstr(files(file).name); 
end 
files = filez; 

chars = zeros(nfiles, 1); 
for file = 1:nfiles 
    chars(file) = length(files{file}); 
end 

filez = files; 
names = struct; 
for file = 1:nfiles 
    curfil = filez{file}; 
    depth = 0; 
    for curchar = 1:chars(file) 
     if curchar == 1 
      curmatch = strmatch(curfil(1:curchar), filez); 
      prevmatch = curmatch; 
     else 
      prevmatch = curmatch; 
      curmatch = strmatch(curfil(1:curchar), filez); 
     end 
     if length(curmatch) ~= length(prevmatch) 
      newnamepart = curfil(1:curchar-1); 
      newstructnamepart = ['X' newnamepart]; %This I did because fieldnames must start with characters 
      %This is where I dont know how to go on... 
     end 
    end 
end 

因此,對於每一個文件名我檢查從其他文件名具有相同字符串開頭的名字開始各部分的字符串。如果這種變化我回去一個字符,這應該是我的第一個節點在樹中。但是我不知道如何創建這樣一棵樹。結構看起來最像我這樣,但我不知道如何創建這個結構,但也許有另一種方式?

+0

你能畫一張圖嗎,即使在一張紙上併發布掃描圖嗎? 另外,你能否提供一個簡單的樹如何在特定文件名上分支的例子? – Oleg

回答

1

理念:

  • 排序的名字一次
  • 集團通過他們的第一個字符的單元陣列的名稱。
  • 按每個組的第二個字符分組。
  • 依此類推。

你也可以使用containers.Map。 你不能使用struct,因爲字段名必須是常規的MATLAB標識符。

function c = group(b, j) 
    c = {}; 
    ch = ''; 
    for i=1:size(b,1) 
     if ~strcmp(b(i,j), ch) 
      ch = b(i,j); 
      c{end+1} = []; 
     end 
     c{end}(end+1,:) = b(i,:); 
    end 

    if j<size(b,2) 
     for k=1:length(c) 
      c{k} = group(c{k}, j+1); 
     end 
    end 
end 

filenames = ['aba'; 'dab'; 'aaa';'abb']; 
b=sortrows(filenames); 
group(b,1) 

ans = 
{ 
    [1,1] = 
    { 
    [1,1] = 
    { 
     [1,1] = aaa 
    } 
    [1,2] = 
    { 
     [1,1] = aba 
     [1,2] = abb 
    } 
    } 
    [1,2] = 
    { 
    [1,1] = 
    { 
     [1,1] = dab 
    } 
    } 
} 
+0

謝謝,很好的綜合答案。 – Leo