无法根据名称有条件地移动文件

Having trouble conditionally moving files based on their names

我正在尝试编写一个脚本,根据名称中的第 7 位和第 8 位数字自动对文件进行排序。我收到以下错误:"Argument must be a string scalar or character vector"。错误来自第 16 行:

Argument must be a string scalar or character vector.

Error in sort_files (line 16) movefile (filelist(i), DirOut)

代码如下:

DirIn = 'C:\Folder\Experiment' %set incoming directory
DirOut = 'C:\Folder\Experiment'

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 等

首先,尽量避免使用 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)))])