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>或其他并行机制。