Хорошая маленькая рекурсивная функция для чтения таблиц в MATLAB.

Одна обычная вещь, с которой я сталкиваюсь в своей работе, — это чтение файлов CSV в MATLAB. Как правило, у меня есть вложенный набор каталогов, содержащих файлы .csv, которые необходимо проанализировать в моем коде. Основная неприятность заключается в том, что нет гарантии, насколько глубоко и сколько файлов .csv будет в подкаталогах. Итак, как нам решить эту проблему? РЕКУРСИЯ!

Пример структуры каталогов

Представьте, что у нас есть следующая структура, которую нам нужно разобрать:

Цель состоит в том, чтобы загрузить все эти файлы .csv в структуру с тем же соглашением об именах, что и выше, и каждый узел конечной точки будет фактической таблицей, считанной в MATLAB. Когда у нас есть это, нам становится намного легче иметь дело с жизнью.

Рекурсия

И вот функция, которая делает ВСЕ работу:

function configurationObject = structifyCSV(entry_path)
   configurationObject = struct;d_struct = dir(entry_path);
   for i=1:length(d_struct)
      if d_struct(i).isdir==0 && contains(d_struct(i).name,’.csv’)
         d = readtable([d_struct(i).folder ‘/’ d_struct(i).name]);
         configurationObject.(strrep(d_struct(i).name,’.csv’,’’))=d;
      else
         if d_struct(i).isdir==1 && ~ismember(d_struct(i).name
            {‘.’,’..’}) % Go deeper
            co = structifyCSV([d_struct(i).folder ‘/’
            d_struct(i).name]);  % RECUR (1)
            configurationObject.(d_struct(i).name)=co;
         end
      end
   end
end

Псевдокод

Сложность здесь заключается в том, чтобы убедиться, что вы правильно выбираете действительные файлы .csv для загрузки readtable или новый подкаталог, который может содержать другие файлы .csv и подпапки. В качестве дополнительного трюка при выполнении команды dir возвращается структура, которая также включает каталоги '.' и '..' которые используются в качестве замены для текущего каталога ('.') и на один каталог выше ('..').

В цикле по команде вывода dir я сначала проверяю, является ли возвращаемый контент файлом с использованием ~isdir, а также содержит ли строка имени .csvподстрока. Если оба эти условия соблюдены, мы можем загрузить его с помощью readtable.

В другом случае, если мы видим, что это каталог, я также убеждаюсь, что он не является членом двух особых случаев (.,..). (Примечание: ismember — моя любимая функция!). Если все это так, то функция вызывает сама себя и повторяет все заново!

В приведенном выше коде вы можете видеть, что в комментарии (1) мы просто снова вызываем функцию. По мере увеличения глубины она будет повторяться все больше и больше и БУМ! Вы получили то, что вам нужно.

Вы можете назвать это так:

configurationObject = structifyCSV([my_path]);

Резюме

MATLAB великолепен, но некоторые задачи иногда раздражают. Это была обычная проблема, с которой я сталкивался, поэтому размещение логики в повторно используемой функции просто делает жизнь намного проще. Будущий Кайл благодарит меня.