- Do not use cd.
- Use fullfile instead of string concatenation.
- Use the isdir field rather than calling isfolder.
- Avoid exist if you can, e.g. the files return by dir exist by definition of that function.
- Avoid nested structures (they are tedious to access data in).
- Avoid putting meta-data (e.g. folder names) into code (e.g. as fieldnames).
How to transfer folder structure to struct data?
11 views (last 30 days)
Show older comments
I have big data inside some folder structure.
I need transfer almost whole(bold path) folder structure in my final struct file with data.
Question is: How to do it better than it is? I know I have 'dir' function but how to use it more smart in my case..
Structure like this:
C:\...\folders\release\mode\const\var\...\... .txt
folders=dir(path);
datas=struct;
s_fol=size(folders,1);
for ii=3:s_fol
cd(path);
if isfolder(folders(ii).name)
fol_now=folders(ii).name;
datas.(fol_now)=struct;
datas.(fol_now).Released=struct;
mode_folder=dir(strcat(path,{'\'},folders(ii).name,{'\Released'}));
s1_fol=size(mode_folder,1);
for ii1=3:s1_fol
cd(strcat(path,{'\'},folders(ii).name,{'\Released'}))
if isfolder(mode_folder(ii1).name)
mode_fol_now=mode_folder(ii1).name;
datas.(fol_now).Released.(mode_fol_now)=struct;
datas.(fol_now).Released.(mode_fol_now).dyn=struct;
var_fol=dir(strcat(path,{'\'},folders(ii).name,{'\Released\'},mode_fol_now,{'\dyn'}));
s2_fol=size(var_fol,1);
for ii2=3:s2_fol
cd(strcat(path,{'\'},folders(ii).name,{'\Released\'},mode_fol_now,{'\dyn'}))
if isfolder(var_fol(ii2).name)
var_fol_now=var_fol(ii2).name;
datas.(fol_now).Released.(mode_fol_now).dyn.(var_fol_now)=struct;
actual_name=strcat(path,{'\'},folders(ii).name,{'\Released\'},mode_fol_now,{'\dyn\'},var_fol_now);
cd(actual_name)
if exist('config.m', 'file') == 2
% PROCESSING DATA & STORE IN STRUCT
end
end
end
end
end
end
end
5 Comments
Jan
on 31 May 2019
I do not understand the 3 sentences of this comment.
What is a "core program" and which ".txt" files are processed by what?
How can this information be used: "existance config.m in defined folder -- condition for run core program"?
In which windows? A folder structure can be found in the file system. Are you sure that it is useful to copy this structure to a nested struct?
Accepted Answer
Jan
on 31 May 2019
It does not sound like a good design to use the folder names as field names. Keeping the names in a cell string might be smarter:
data(k).value = rand(10);
data(k).condition = {'folders', 'release', 'mode', 'const', 'var'};
Deeply nested structs are rarely useful for processing. But if you have a good reason to do so:
% Get all config.m files recursively (It is just a guess, that you need this):
BasePath = 'C:\Temp\';
FileList = dir(fullfile(BasePath, '**\config.m'));
data = struct([]);
for iFile = 1:numel(FileList)
Folder = FileList(iFile).path(numel(BasePath)+1:end);
Keys = strsplit(Folder, filesep);
data.(Keys{1}).(Keys{2}).(Keys{3}).(Keys{4}).(Keys{5}) = ???
end
More Answers (0)
See Also
Categories
Find more on File Operations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!