遇到有条件地根据文件名移动文件的问题

时间:2019-09-13 19:10:38

标签: matlab acoustics

我正在尝试编写一个脚本,该脚本将根据文件名中的第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等。

1 个答案:

答案 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)))])