这里使用的是 dir 函数 将文件夹中文件以结构体数组形式返回信息的功能
file = dir('myfolder') #指定某个文件夹里的所有文件
file = dir('*.xlsx'); #指定导入的文件名
两种方式都可以。每个文件输入到matlab变成一个 5x1 的struct,struct 包含的信息如下
MyFolderInfo=5×1 struct array with fields:
name
folder
date
bytes
isdir
datenum
那么就可以得到初始的文件名
oldname = file.name;
实际上如果同学们的初始命名没有问题的话,可以没有名单,直接在旧名里面找关键字符就行。但是很显然,同学们非常无序,我只能找到系统下载下来自带的每个同学的学号作为关键字符。
num = regexp(oldname,'\d*\d*','match');
xuehao = num{1};
fileID = fopen('名单.txt');
name = textscan(fileID,'%s %s');
idx = find(strcmp(name{2},xuehao));
前两行代码:提取 oldname 里的学号 【regexp 第二种】
第三四行代码:读取 ‘名单.txt’ 文件,并将文件内容保存在 一个 1-by-2 元胞数组 name 里.
最后一行代码:找到该学号在名单里的位置
strcmp(s1,s2)比较 s1 和 s2,如果二者相同,则返回 1 (true),否则返回 0 (false)。
str = 'bat cat can car coat court CUT ct CAT-scan';
expression = 'c[aeiou]+t';
startIndex = regexp(str,expression)
startIndex = 1×2
5 17
startIndex 中的值指示与正则表达式匹配的每个单词的第一个字符的索引。匹配单词 cat 在索引 5 处开始,coat 在索引 17 处开始。单词 CUT 和 CAT 不匹配,因为它们是大写的。
newname = [xuehao, name{1}{idx},'.xlsx'];
restr = ['!rename',' "',oldname,'" ',newname];
eval(restr)
eval 这一步说实话我也没太明白。但是我看其他用
restr = [‘!rename’ 32 oldname 32 newname];
但我运行一直报错
file = dir('*.xlsx');
fileID = fopen('名单.txt');
name = textscan(fileID,'%s %s');
len = length(file);
ID = zeros(1,length(name{1}));
for i = 1:len
oldname = file(i).name;
num = regexp(oldname,'\d*\d*','match');
xuehao = num{1};
idx = find(strcmp(name{2},xuehao));
if ID(idx) == 0
newname = [xuehao, name{1}{idx},'.xlsx'];
ID(idx) = 1;
else
newname = [xuehao, name{1}{idx},num2str(ID(idx)),'.xlsx'];
ID(idx) = ID(idx)+1;
end
restr = ['!rename',' "',oldname,'" ',newname];
eval(restr)
end
增加了变量 ID 是因为有些同学可能会交好几个文件。