Matlab 在文件夹中查找一对文件
我有一个文件夹,里面有上万个文件。文件夹中的每个文件都应该有一对匹配项,但开头的几个字母除外,例如:Matlab 在文件夹中查找一对文件,matlab,file,Matlab,File,我有一个文件夹,里面有上万个文件。文件夹中的每个文件都应该有一对匹配项,但开头的几个字母除外,例如: X_Date_Time_Place.dat Y_Date_Time_Place.dat 每个X.*和Y.*组合成一对文件 但是,总有数千个额外的文件需要从文件夹中删除。额外文件也属于相同类型,但没有成对文件。例如,可能有更多的'X\u Date\u Time\u Place.dat'然后是'Y\u Date\u Time\u Place.dat'。文件名中的变量只有'Date','Time'和
X_Date_Time_Place.dat
Y_Date_Time_Place.dat
每个X.*
和Y.*
组合成一对文件
但是,总有数千个额外的文件需要从文件夹中删除。额外文件也属于相同类型,但没有成对文件。例如,可能有更多的'X\u Date\u Time\u Place.dat'
然后是'Y\u Date\u Time\u Place.dat'
。文件名中的变量只有'Date'
,'Time'
和'Place'
我编写了一个简单的脚本(使用for循环),它取一个文件的名称并检查循环中的所有其他文件,直到找到匹配的文件为止。然而,要找到一对需要花费大量的时间
有没有更快更有效的方法 您可以使用该函数并指定希望文件名包含的字符串和/或扩展名:
在您的示例中:
I=dir('* _Date_Time_Place *.dat')
将返回一个struct
I
,其字段将是包含字符串*\u Date\u Time\u Place*
且具有扩展名.dat
的所有文件名
然后,您可以通过调用I(1)
,I(2)
来访问结构中的元素
小调:
要使其正常工作,您当前的文件夹必须是文件所在的文件夹。您可以使用该函数并指定希望文件名包含的字符串和/或扩展名:
在您的示例中:
I=dir('* _Date_Time_Place *.dat')
将返回一个struct
I
,其字段将是包含字符串*\u Date\u Time\u Place*
且具有扩展名.dat
的所有文件名
然后,您可以通过调用I(1)
,I(2)
来访问结构中的元素
小调:
要使其正常工作,您当前的文件夹必须是您的文件所在的文件夹。嗯,我没有10000个文件的格式是这样的,但我会这样做
Xfiles = dir('X*.dat');
filenames = {Xfiles.name};
% Here I would determine how many pairs I am looking for (the unique X's)
% I am assuming that your X files are unique.
% remove the "X" from the file name
filenames2 = cellfun(@(x) repexprep(x, 'X',''));
keys = filenames2;
values = 1:length(filenames2);
fileMap = containers.Map(keys, values);
% for each Y look for the filename
Yfiles = dir('Y*.dat');
Yfiles2 = cellfun(@(x) repexprep(x, 'Y',''));
pairs = cell(length(Yfiles2),2);
% this assumes that for every Y there must be an X
% if this is not true then handle the empty idx case.
for x = 1:length(Yfiles2)
idx = fileMap(Yfiles2{x});
pairs(x,:) = {Xfiles(idx), Yfiles(idx)};
end
嗯,我没有10000个这样格式化的文件,但我会这么做
Xfiles = dir('X*.dat');
filenames = {Xfiles.name};
% Here I would determine how many pairs I am looking for (the unique X's)
% I am assuming that your X files are unique.
% remove the "X" from the file name
filenames2 = cellfun(@(x) repexprep(x, 'X',''));
keys = filenames2;
values = 1:length(filenames2);
fileMap = containers.Map(keys, values);
% for each Y look for the filename
Yfiles = dir('Y*.dat');
Yfiles2 = cellfun(@(x) repexprep(x, 'Y',''));
pairs = cell(length(Yfiles2),2);
% this assumes that for every Y there must be an X
% if this is not true then handle the empty idx case.
for x = 1:length(Yfiles2)
idx = fileMap(Yfiles2{x});
pairs(x,:) = {Xfiles(idx), Yfiles(idx)};
end
您可以拆分为两个列表:
xlist = dir( fullfile( path_to_folder, 'X_*.dat') );
ylist = dir( fullfile( path_to_folder, 'Y_*.dat') );
%// remove prefixes
xlist = cellfun(@(x) x(3:end), {xlist.name}, 'uni', false);
ylist = cellfun(@(y) y(3:end), {ylist.name}, 'uni', false);
common = intersect(xlist, ylist);
使用查找常用后缀会使您保留所有的Date\u Time\u Place.dat
,其中既有X\u Date\u Time\u Place.dat
又有Y\u Date\u Time\u Place.dat
要获取所有对,请执行以下操作:
allParis = cellfun(@(c) {fullfile(path_to_folder,['X_',c]),
fullfile(path_to_folder,['Y_',c])}, common, 'uni', false);
您可以拆分为两个列表:
xlist = dir( fullfile( path_to_folder, 'X_*.dat') );
ylist = dir( fullfile( path_to_folder, 'Y_*.dat') );
%// remove prefixes
xlist = cellfun(@(x) x(3:end), {xlist.name}, 'uni', false);
ylist = cellfun(@(y) y(3:end), {ylist.name}, 'uni', false);
common = intersect(xlist, ylist);
使用查找常用后缀会使您保留所有的Date\u Time\u Place.dat
,其中既有X\u Date\u Time\u Place.dat
又有Y\u Date\u Time\u Place.dat
要获取所有对,请执行以下操作:
allParis = cellfun(@(c) {fullfile(path_to_folder,['X_',c]),
fullfile(path_to_folder,['Y_',c])}, common, 'uni', false);
我忘了提到额外的文件也是同一类型的,但没有成对的。例如,可能会有更多的“X_Date_Time_Place.dat”而不是“Y_Date_Time_Place.dat”。文件名中只有'Date'、'Time'和'Place'变量。我假设您正在搜索给定的一对(当然,用实际值替换'Date\u Time\u Place')。您想让代码提取所有对吗?是的,如果可能的话。如果我不能完全理解你的回答,我很抱歉。但是,问题是,我已经尝试过dir,却找不到另一条前进的道路。如果您能给我举个例子,我将不胜感激。我忘了提到额外的文件也是同一类型的,但没有成对的。例如,可能会有更多的“X_Date_Time_Place.dat”而不是“Y_Date_Time_Place.dat”。文件名中只有'Date'、'Time'和'Place'变量。我假设您正在搜索给定的一对(当然,用实际值替换'Date\u Time\u Place')。您想让代码提取所有对吗?是的,如果可能的话。如果我不能完全理解你的回答,我很抱歉。但是,问题是,我已经尝试过dir,却找不到另一条前进的道路。如果您能给我举个例子,我将不胜感激。请您提供一个更详细的解释,说明哪些文件是您不想匹配的。您想匹配什么和排除什么并不清楚。请您提供一个更详细的解释,说明您不想匹配哪些文件。现在还不清楚你想匹配什么和排除什么。太好了。谢谢。还有一件事。在检索所有匹配的文件名之后,我使用copy命令检索所有对。但我还是在for循环中使用了“copyfile”。这是唯一的方法还是我可以用一种更简洁的方法来做。@Mushi如果你只是复制特定的文件,不能使用通配符,恐怕循环是唯一的选择。你可以考虑<代码> PAROF> /CODE >或其他并行机制,非常完美。谢谢。还有一件事。在检索所有匹配的文件名之后,我使用copy命令检索所有对。但我还是在for循环中使用了“copyfile”。这是唯一的方法还是我可以用一种更简洁的方法来做。@Mushi如果你只是复制特定的文件,不能使用通配符,恐怕循环是唯一的选择。不过,您可以考虑<代码> PAROF< /COD>或其他并行机制。