rename files using matlab

1.239 visualizaciones (últimos 30 días)
Changoleon
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
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...
Malwandla Laurel
Malwandla Laurel el 21 de Mzo. de 2022
How to rename the data file using matlab

Iniciar sesión para comentar.

Respuesta aceptada

Walter Roberson
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
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
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.

Iniciar sesión para comentar.

Más respuestas (3)

KSSV
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.
  1 comentario
Changoleon
Changoleon el 5 de Mayo de 2017
This code does NOT exactly do what I wanted. It adds _ to every file. I wanted to add _ after the first letter of the name of each file. But it helped, thank you KSSV!

Iniciar sesión para comentar.


Solene Frileux
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
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

Iniciar sesión para comentar.


Matteo
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?

Categorías

Más información sobre File Operations en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by