How to ask the user how many file extensions to search for

1 Ansicht (letzte 30 Tage)
Nom
Nom am 13 Sep. 2019
Kommentiert: Nom am 17 Sep. 2019
I currently have a script which find files in a folder with a matching string that the user inputs.
I also have code where the user enters the file extensions he wants the script to look for.
ext1 = inputdlg('Please enter file extension #1: **\*. ');
ext2 = inputdlg('Please enter file extension #2: **\*. ');
ext3 = inputdlg('Please enter file extension #3: **\*. ');
fileData = [dir(fullfile(fileLoc,char(ext1))); dir(fullfile(fileLoc,char(ext2))); dir(fullfile(fileLoc,char(ext3)))];
What I want to do instead of ask the user how many different file extensions he wants to look for and then ask for them accordingly.
(e.g. User inputs he wants to search for 5 different file extensions and the script asks for 5)
I'd like to do this instead of just hard-coding in how many file extensions he can search for.

Akzeptierte Antwort

Adam Danz
Adam Danz am 13 Sep. 2019
Bearbeitet: Adam Danz am 13 Sep. 2019
That's too much work (for you and the user). Instead, the user could just list all file extensions in the first dialog, separated by commas. Then you can separate that list into individual extensions.
  • extList is a cell array of character vectors that contain the user's input list
  • nExt is the number of extensions entered
ext = inputdlg('Please enter file extensions separated by a comma: **\*. Example: txt, csv, ogg');
if ~isempty(ext) %check if user entered anything
% Separate selections
extList = strtrim(strsplit(ext{1},','));
extList(cellfun(@isempty,extList)) = []; % get rid of empties (if any)
nExt = numel(extList); %number of extensions
end
For example, in the inputdlg enter this: txt, csv, ogg, xlsx
If there is a set list of possible file extensions, a better idea would be to use a listbox where the user can merely select from a set of options.
  12 Kommentare
Nom
Nom am 13 Sep. 2019
Thank you! Yes I've already implemented it in that exact way,
weirdly enough running this script from a .m file works flawlessly
But when I moved the new code into my app designer's code it gives this error.
Cell contents reference from a non-cell array object.
on this line
extList = strtrim(strsplit(ext{1},','));
Which is pretty confusing because this is the exact code which worked straight from a .m script file.
The app designer's code was functioning with my old way (three file extensions hard coded in)
So I'm not sure why app designer is seeing something differently
Adam Danz
Adam Danz am 13 Sep. 2019
Bearbeitet: Adam Danz am 13 Sep. 2019
Hmmm, could you show us exactly what's in ext and the result of class(ext)?
[update]
I just embedded the code from my answer into app designer and entered a variety of inputs including several extensions, 1 extension, and empty, and there was no error.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Nom
Nom am 13 Sep. 2019
Right before
extList = strtrim(strsplit(ext{1},','));
is executed.
K>> ext
ext =
'txt, pdf, docx'
K>> class(ext)
ans =
'char'
Above what I put into the command script
  2 Kommentare
Walter Roberson
Walter Roberson am 13 Sep. 2019
So somehow ext is a character vector instead of a cell array of char.
As a general fix: after you have called
ext = inputdlg('Please enter file extensions separated by a comma:. Example: txt, csv, ogg: ');
add
ext = cellstr(ext);
Though you might have to check isempty() first.
Adam Danz
Adam Danz am 13 Sep. 2019
inputdlg should always return a cell array:
Where is the 'txt, pdf, docx' char array coming from? I can't be the output to inputdlg.

Melden Sie sich an, um zu kommentieren.


Nom
Nom am 13 Sep. 2019
Awesome!
I'm forever in your debt
Works perfectly!
  17 Kommentare
Adam Danz
Adam Danz am 17 Sep. 2019
I'm not sure how that solved the error you were getting.
Notice at the end of this line you transpose the array.
fullPaths = strrep(fullPaths,fileLoc,'')'; % Remove the header path
% HERE ^
So when you comment that out, fullPaths remains as a row-cell-array.
That causes the error when you try to horizontally concatenate the bottom line below.
outputData = [{'Starting Path:' fileLoc ' ';
'Time to Execute:' [sprintf('%.2f',overallTime+overallTime2) 's'] ' ';
'File Count:' num2str(sum(finalFlag)) ' ';
'Date' 'Size (kb)' 'File'};
fileDates(finalFlag) num2cell(fileSizes(finalFlag) ./1024) fullPaths(finalFlag)];
%|___column array___| {______________Column array_________| |____Row array______|
Nom
Nom am 17 Sep. 2019
Oh wow, I completely forgot about that.
Thank you so much

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Time Series Events finden Sie in Help Center und File Exchange

Produkte


Version

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by