Load text file from subfolder

10 ビュー (過去 30 日間)
Sohel Rana
Sohel Rana 2020 年 9 月 9 日
コメント済み: Walter Roberson 2020 年 9 月 14 日
Hello Creative People,
I'm facing problems in loading data from subfolders. There is a main folder called "fiber optics" and this folder contains about 200k subfolders. Each subfolder contains just only one text file. How can I load text file from each subfolder one after another and plot it?

採用された回答

Walter Roberson
Walter Roberson 2020 年 9 月 9 日
編集済み: Walter Roberson 2020 年 9 月 9 日
projectdir = 'fiber optics';
dinfo = dir(fullfile(projectdir, '**', '*.txt'));
filenames = fullfile({dinfo.folder}, {dinfo.name});
nfiles = length(filenames);
datum = cell(nfiles,1);
foldernames = cell(nfiles,1);
for K = 1 : nfiles
thisfile = filenames{K};
fullparent = fileparts(thisfile);
[~, foldername] = fileparts(fullparent);
datum{K} = load(thisfile);
foldernames{K} = foldername;
end
Now you have a cell array, datum, and a cell array foldernames, and can plot as appropriate, using the foldernames as labels.
I doubt that you want 200k lines on one plot, so I will not try to guess how you want to do the plotting.
  13 件のコメント
Sohel Rana
Sohel Rana 2020 年 9 月 13 日
I'm not directly plotting datum{K}. Actually, each txt file has three columns and I will need to plot column 1 and 3. Column 1 is the x-axis value whereas 3 is the y-axis value. I used your recent code but did not get any title in the plot. Datum is a cell and for each cell I will get the graph. For example, when I used the follwoing code:
plot(datum{1,1}(:,1), datum{1,1}(:,3))
I got a graph for the first cell of datum. However, how it will automatically show the filename as title/legend for this graph?
Walter Roberson
Walter Roberson 2020 年 9 月 14 日
title(labels{K})
to have it show up in the title.
Use labels{K} as the 'DisplayName' option on whatever plot() you do use, if instead you want the name to show up when you
legend show

サインインしてコメントする。

その他の回答 (1 件)

Adam Wyatt
Adam Wyatt 2020 年 9 月 9 日
BaseDir = 'BaseDir'; % Change string to base folder
tmp = dir(BaseDir); % Obtains list of files and folders in BaseDir
SubDir = {tmp.name}; % Extract list of names
SubDir = SubDir([tmp.isdir]); % Select entries that are directories
SubDir(1:2) = []; % Ignore first two entries ('.' and '..')
Data = cell(size(SubDir)); % Preallocate data cell array
% Loop through subfolders and perform custom load function, saving output to cell
for n=1:length(SubDir)
FullDir = fullfile(BaseDir, SubDir); % Create full folder name
fnames = dir(fullfile(FullDir, '*.txt')); % Obtain filename (assuming 'txt' extension)
Data{n} = LOAD_FUNCTION(fullfile(FullDir, fname(1).name)); % Either change LOAD_FUNCTION to built in text read function or your custom function that simply takes the filename as input
end
The concept is to first obtain the list of subfolders, then to loop through each subfolder and find the filename before loading it.
If the filename is the same and known in advance, you can simply use that.
If there are multiple files in the folder, you can loop through each file.
If the output is always the same size and format, you can output to a pre-allocated array rather than a cell array - I've assumed the worst-case scenario of different outputs from each file.
You need to change the BaseDir folder and the LOAD_FUNCTION function name as appropriate.

カテゴリ

Help Center および File ExchangeData Distribution Plots についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by