我正在尝试编写一个脚本,该脚本将根据文件名中的第7位和第8位自动对文件进行排序。我收到以下错误:"Argument must be a string scalar or character vector"
。错误来自第16行:
参数必须是字符串标量或字符向量。
sort_files中的错误(第16行) movefile(文件列表(i),DirOut)
代码如下:
DirIn = 'C:\Folder\Experiment' %set incoming directory
DirOut = 'C:\Folder\Experiment\1'
eval(['filelist=dir(''' DirIn '/*.wav'')']) %get file list
for i = 1:length(filelist);
Filename = filelist(i).name
name = strsplit(Filename, '_');
newStr = extractBetween(name,7,8);
if strcmp(newStr,'01')
movefile (filelist(i), DirOut)
end
end
此外,我试图将文件夹设置为有条件,以便如果10-11位为02,则文件转到DirOut / 02等。
答案 0 :(得分:1)
首先,请尝试避免使用eval
函数,因为它很慢且难以理解,因此令人恐惧。特别是如果您需要创建变量。而是这样做:
filelist = dir(fullfile(DirIn,'*.wav'));
第二,段落:
name = strsplit(Filename, '_');
为name
创建一个列表,因此您可以访问name{1}
或可能的name{2}
。这些都是字符串。但是name
不是字符串,而是列表。 extractBetween
需要一个字符串作为输入。这就是为什么您遇到此问题。但是请注意,您只需完成以下操作即可:
newStr = name(7:8);
如果name是一个字符串,则在Matlab中是一个char
数组。
编辑:
由于现在已经宣称该错误发生在movefile (filelist(i), DirOut)
上,因此可能的原因是因为filelist(i)
是一个结构。在输入中应指定文件名(字符数组)的位置。解决方案应将该行替换为:
movefile(fullfile(filelist(i).folder, filelist(i).name), DirOut)
现在,如果您还要对输出文件夹进行编号,则可以执行以下操作: movefile(fullfile(filelist(i).folder,filelist(i).name),[DirOut,filesep,name(7:8)])
这会将文件移动到/ DirOut / 01。如果需要/ DirOut / 1,可以执行以下操作:
movefile(fullfile(filelist(i).folder, filelist(i).name), [DirOut,filesep,int2str(str2num(name(7:8)))])