2013-12-20 2 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 

Таким образом, для каждого файла я проверяю для каждой части строки от начала имени которого другие имена файлов начинаются с одной и той же строкой. Если это изменение, я возвращаю один символ, и это должен быть мой первый узел в дереве. Однако я не знаю, как создать такое дерево. Мне кажется, что Struct мне больше нравится, но я не уверен, как создать эту структуру, но, может быть, есть другой способ?

+0

Не могли бы вы нарисовать график даже на листе бумаги и опубликовать сканирование? Кроме того, можете ли вы представить простой пример того, как дерево разветвляется на определенные имена файлов? – Oleg

ответ

1

Идея:

  • Сортировать имена сразу
  • Group имен в массиве ячеек по их первому символу.
  • Группируйте каждую группу по их второму персонажу.
  • И так далее.

Вы также можете использовать контейнеры. Карта. Вы не можете использовать 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

Смежные вопросы