フィルターのクリア

Using switch case to rename files in a folder

4 ビュー (過去 30 日間)
Louise Wilson
Louise Wilson 2020 年 5 月 11 日
コメント済み: Louise Wilson 2020 年 5 月 13 日
I have a folder of .png files which have a timestamp printed on them. Unfortunately, the only metadata in the .png files is the date, so I am having to manually create a timestamp for the filename of each image. To do this, I first of all numbered each .png from each day from 0001-end. For the first day of each batch of images, I can then look at which number=what time, and add that time to the filename. This is what I have done here:
%5th May 2020, Louise Wilson
%Rename files in a folder.
location=('H:\Cameras\Cameras_frames\SiteOne_rename'); %place where files to be renamed are
d=dir(fullfile(location, '*png')); %list all files in folder
files=length(d); %number of files in folder
for i=1:files
%get site
site=strsplit(location, {'\', '_'});
site=site(5);
%get date
file=strsplit(d(i).name, {'-', '.'});
filedate=file(1); %yyyymmdd
%get number
framenumber=char(file(2)); %####.png
%get time
switch framenumber
case '0001'
timeis='0600';
case '0002'
timeis='0640';
case '0003'
timeis='0650';
case '0004'
timeis='0700';
case '0005'
timeis='0710';
case '0006'
timeis='0720';
case '0007'
timeis='0730';
case '0008'
timeis='0740';
otherwise
error('Unknown time!');
end
%}
newfilename=char(strcat(site, '-', filedate, timeis, '-', framenumber));
%newfilename=char(strcat(site, '-', (d(i).name)));
movefile(fullfile(location, d(i).name), fullfile (location, newfilename)); %rename file
clearvars -except location folder d files folderparts sitename
end
I have removed some of the times to shorten the code but the times actually cover a full day up to 2000.
My problem is that this is quite a long bit of code and also, for the many batches of images I have, the first frame number on each day is not always the same time. The first time depends on when the camera was triggered and that changes every month or so when I check the camera.
I would like to be able to say what the first frame is, and rather than then subsequently list all of the other times, just say that the second image is the first image, plus 10 minutes.
To try to explain clearly:
case '0001'
timeis='0600';
case '0002'
timeis= %case0001+10mins;
case '0003'
timeis=%case0001+20mins;
So, perhaps some sort of loop to increase the case number by one on each iteration, and with that add 10 mins? Can anyone help? Thanks!
  2 件のコメント
Stephen23
Stephen23 2020 年 5 月 12 日
編集済み: Stephen23 2020 年 5 月 12 日
Rather than concatenating strings, it is usually clearer and more efficient to use sprintf, e.g.:
newfilename = sprintf('%s-%s%s-%s',site,filedate,timeis,framenumber);
Calling clearvars is unlikely to be required.
Louise Wilson
Louise Wilson 2020 年 5 月 13 日
Thanks!

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

採用された回答

Stephen23
Stephen23 2020 年 5 月 12 日
編集済み: Stephen23 2020 年 5 月 12 日
Method one: datetime scalar:
Before the loop, define both the step size and the first time:
>> step = minutes(10);
>> first = datetime(0,0,0,6,0,0,'Format','HHmm') % could also include the date!
first =
0600
The replace the entire switch with this:
timeis = char(first+step*(str2double(framenumber)-1));
Method two: datetime vector:
Before the loop, define a vector of times:
>> step = minutes(10);
>> first = datetime(0,0,0,6,0,0,'Format','HHmm');
>> dtvec = first:step:datetime(0,0,0,24,0,0); % Select the end time to suit your data
Then replace the entire switch with this:
timeis = char(dtvec(str2double(framenumber)));
  1 件のコメント
Louise Wilson
Louise Wilson 2020 年 5 月 13 日
Thanks Stephen. I tried the first option and that nailed it! Much more efficient code and solves my problem perfectly. Thank you!

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

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeEnvironment and Settings についてさらに検索

製品


リリース

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by