rename files using matlab
1.214 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Changoleon
el 5 de Mayo de 2017
Respondida: Matteo
el 7 de Mzo. de 2023
Hello all,
I have a folder on my desktop that has 10 text files as following:
A.txt
Abgd.txt
B.txt
Bbgd.txt
C.txt
Cbgd.txt
S.txt
Sbgd.txt
std.txt
stdbgd.txt
I want to write a code that the changes the names of the first 8 files. I want to rename these files and add an underline (i.e. '_') after the first letterof each file. So my output should look like this:
A_.txt
A_bgd.txt
B_.txt
B_bgd.txt
C_.txt
C_bgd.txt
S_.txt
S_bgd.txt
Here is what I have done so far:
clear all; clc;
d = 'C:\Users\krraz\Desktop\Day13\*.txt';
oldnames = dir(d);
oldnames = {oldnames(~[oldnames.isdir]).name};
L = length(oldnames);
oldnames = oldnames(1:L-2);
points = oldnames(1:2:end);
points = cellfun(@(x) x(1:1), points, 'UniformOutput', false);
strr = '_.txt'; strr = string(strr);
for n = 1:numel(points)
formatSpec = '%1$s%2$s';
points{n} = sprintf(formatSpec,points{n},strr);
end
bgds = oldnames(2:2:end);
bgds = cellfun(@(x) x(1:1), bgds, 'UniformOutput', false);
strr = '_bgd.txt'; strr = string(strr);
for n = 1:numel(bgds)
formatSpec = '%1$s%2$s';
bgds{n} = sprintf(formatSpec,bgds{n},strr);
end
newnames = [points bgds];
newnames = sort(newnames);
for j=1:numel(oldnames)
movefile(d,newnames{j},'f');
end
But when I run my code, It generates a new folder on my desktop and doesn't change the names of the files. What am I doing wrong?
Any insight will be appreciated.
10 comentarios
Walter Roberson
el 10 de Sept. de 2021
Better would be
ext = ".jpg"; %change to whatever is appropriate
for k = 1 : x
src = compose("a (%d)", k) + ext;
dst = compose("a%04d", k) + ext;
if exist(src, 'file');
movefile(src, dst);
else
fprintf('expected file "%s" not found\n', src);
end
end
...just on the remote chance that the file extension in ext happens to contain a % that compose() would try to act on...
Respuesta aceptada
Walter Roberson
el 5 de Mayo de 2017
Editada: Walter Roberson
el 15 de Sept. de 2018
You have
d = 'C:\Users\krraz\Desktop\Day13\*.txt';
which includes the *.txt . You do not change d in your code. Later you have
movefile(d,newnames{j},'f');
but d still has the *.txt part, so it is going to move all the text files instead of moving one at a time.
projectdir = 'C:\Users\krraz\Desktop\Day13';
dinfo = dir( fullfile(projectdir, '*.txt') );
oldnames = {dinfo.name};
unwanted = cellfun(@isempty, regexp(oldnames, '^[A-Z][^_].*') );
oldnames(unwanted) = [];
newnames = regexprep(oldnames, '^(.)', '$1_');
for K = 1 : length(oldnames)
movefile( fullfile(projectdir, oldnames{K}), fullfile(projectdir, newnames{K}) );
end
6 comentarios
Josh Case
el 3 de Ag. de 2022
How do I modify "regexprep(oldnames, '\w*', 'JOY_Y', 'once')" to only output "JOY_Y"? Currently it takes a file named "SigGen18_2022-05-26_07-45-21" and outputs "{'JOY_Y-05-26_07-45-21.mat'}"
Walter Roberson
el 3 de Ag. de 2022
Why? The output for that would be repmat({'JOY_Y'}, numel(oldnames), 1) except for fiddling for the case of empty entries.
Más respuestas (3)
KSSV
el 5 de Mayo de 2017
Editada: KSSV
el 5 de Mayo de 2017
% Get all text files in the current folder
files = dir('*.txt');
% Loop through each file
for id = 1:length(files)
% Get the file name
[~, f,ext] = fileparts(files(id).name);
rename = strcat(f,'_',ext) ;
movefile(files(id).name, rename);
end
Run this code the folder which has your text files.
Solene Frileux
el 13 de Sept. de 2018
Editada: Walter Roberson
el 15 de Sept. de 2018
Hello,
I Have a question about the same subject.
I have several files:
FoodS01HealthSession1.mat
FoodS01PracticeSession1.mat
FoodS01TasteSession1.mat
FoodS01TestSession1.mat
That go from S01 to S021 and I would like to all rename them as following
FoodSub110HealthSession1.mat
FoodSub110PracticeSession1.mat
FoodSub110TasteSession1.mat
FoodSub110TestSession1.mat
from 110 to 130
I cannot manage doing it using the function rename, as I donnnot know how to correctly code the loop nor using the function.
Could anyone help me?
Thanks a lot
1 comentario
Walter Roberson
el 15 de Sept. de 2018
Untested
projectdir = '.';
dinfo = dir( fullfile(projectdir, '*.txt') );
oldnames = {dinfo.name};
lookfor = 'FoodS0';
wanted = strncmp(oldnames, lookfor, length(lookfor));
oldnames(~wanted) = [];
for K = 1 : length(oldnames)
this_name = oldnames{K};
old_info = regexp(this_name, '(?<prefix>\D+)(?<id>\d+)(?<suffix>.+)', 'names';
old_id = str2double(old_info.id);
new_name = [old_info.prefix 'ub' sprintf('%03d', old_id+109) old_info.suffix];
movefile( fullfile(projectdir, this_name), fullfile(projectdir, new_name) );
end
Matteo
el 7 de Mzo. de 2023
Good morning everyone, I should import a series of PDF doc named 'abstract_included-1.pdf' (from 1 to 225) and then perform a linguistic analysis (tokenization and lemmatization) on each doc. I would like to do this through a loop, but I can't give the right input to make the loop go through all the documents. Could anyone help me?
0 comentarios
Ver también
Categorías
Más información sobre File Operations en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!