在 MatLab 中按条件加载文件



我已经搜索了一些从分子数据库加载xyz文件(带有数字的表格(的方法,但无法使代码按照我想要的方式完美运行。

如果比较矩阵为 =0,则打开所有文件,如果它的大小为 1,1但与 0 不同,则将所有文件与compare中的文件进行比较,最后,如果大小为>1,1,则指定文件并且它有效。

此外,这些文件以数字命名,能够在不重命名的情况下打开它们会很好。

如果我记得我的 matlab 是 2016 年,我不经常编码,这就是为什么我搞砸了语法,并希望让它在长时间的比较中变得容易。如果有人知道如何打开xyz文件的在线数据库,那就更好了。

cd input
compare=['a2';'s4'];
cd ..
NumMols=size(compare);
if compare = 0
compare = dir;
compare = compare(~[compare.isdir]);
NumMols=size(compare);
else if size(compare)=(1,1)
FileNrOne=compare
compare = dir;
compare = compare(~[compare.isdir]);
compare = compare(~[FileNrOne]);
NumMols=size(compare)+1;
end
for k=1:NumMols
cd input
mol = dlmread(compare(k),'t');
cd ..
end

编辑1: 我正在添加我使用的代码,因为一条评论要求一些我已经运行并工作的代码。我还需要重命名文件,以便文件名中没有数字。

cd input
compare=['a';'s'];
cd ..
NumMols=size(compare);
for k=1:NumMols
cd input
mol = dlmread(compare(k),'t');
cd ..
%some comparisons
end
%more comparisons

据我了解,您的问题是您想要获取包含零个、一个或多个项目的文件名列表,并且您希望在每种情况下采取不同的操作。您要执行的操作之一是读取特定目录中的文件名称,并将其与原始列表中的文件名进行比较。

我在代码中看到的第一个问题是您将列表指定为字符数组:

compare=['a';'s'];

在比较时,这可能会给您带来问题,因为每个文件名都会填充空格,使其长度与最长文件名相同。请改用字符串的单元格数组。要检查此数组中有多少项,请使用length

接下来,您要获取目录的内容:

compare = dir;
compare = compare(~[compare.isdir]);

没关系,它为您提供了一个结构数组,其中包含所有文件的详细信息,但不包括目录。但是这个

compare = compare(~[FileNrOne]);

是没有意义的,因为据我所知FileNrOne应该是一个字符数组,而~['some character array']只是返回一个字符数组长度的逻辑数组,所有元素都为 false。如果你有一个来自dir的结构数组 - 我们称之为dirResult- 并且你想删除名称为removeMe的元素,请执行以下操作:

dirResult = dirResult(~strcmpi(removeMe, {dir.name}));

如果您的文件系统不区分大小写(通常为 Windows、Mac(,请使用strcmpi,如果区分大小写(Linux(,请使用strcmp

如果此答案无法解决您的问题,请更新您的问题,更详细地说明出了什么问题,或者提出一个新的、更具体的问题。

由于我发现很难阅读其他问题的答案,因此我认为添加一个解释我所学内容的答案会很好。此外,我可能学错了什么,有人可能会在这里纠正我。

首先,在给定文件的情况下需要compare中的字符串单元格数组,iscell检查该后词。

compare = {'s444173xyz.txt','a2345345xyz.txt'}; %or compare =0;
NumMols = size(compare);
tf = iscell(compare);
if tf == 0
if compare == 0
compare = dir('input');
compare = compare(~[compare.isdir]);
NumMols=size(compare);
end
else
if tf == 1
if NumMols == 1
FileNrOne=compare
compare = dir;
compare = compare(~[compare.isdir]);
compare = compare(~[FileNrOne]);
NumMols=size(compare)+1;
end
end
end
for k=1:NumMols
cd input
if tf == 1
mol = dlmread(char(compare(k)),'t');
else
mol = dlmread(compare(k).name,'t');
end
cd ..
end

我需要研究compare = compare(~[FileNrOne]);因为它引起了其他问题,在这些问题上比较确实变得有用

最新更新