我有大量的大数据文件。我希望能够对每个文件中的数据进行分类,然后将文件名保存到单元格数组中,这样最后我将为每个数据类别提供一个文件名单元格数组,然后我可以将其保存到一个mat
文件,以便我可以稍后返回并对每个类别运行分析。它可能看起来像这样:
MatObj = matfile('listOfCategorizedFilenames.mat');
MatObj.boring = {};
MatObj.interesting = {};
files = dir(directory);
K = numel(files);
for k=1:K
load(files(k).name,'data')
metric = testfunction(data)
if metric < threshold
MatObj.boring{end+1} = files(k).name;
else
MatObj.interesting{end+1} = files(k).name;
end
end
由于文件列表很长,testfunction
可能很慢,我想将其设置为在一夜之间或周末无人值守运行(这是一个精简版本,metric
可能会返回几个不同的类别中的一个),并且在崩溃或无法预料的错误的情况下,我想动态保存数据,而不是在内存中填充单元格数组并在最后转储到磁盘。
问题是使用matfile
将不允许单元格索引,因此保存步骤会引发错误。我的问题是,这种限制是否有解决方法?有没有更好的方法将文件名逐步写入一个易于以后检索的列表?
答案 0 :(得分:1)
Mat文件可能是存储文件列表的最有效方法,但我想每当我遇到这个问题时,我会创建一个单元格数组并使用xlswrite
或fprintf
将其保存到我稍后可以重新加载的文档。
你说保存步骤会抛出一个错误,所以我假设这部分没问题,对吗?
for k=1:K
load(files(k).name,'data')
metric = testfunction(data)
if metric < threshold
MatObj.boring{end+1} = files(k).name;
else
MatObj.interesting{end+1} = files(k).name;
end
end
就个人而言,我刚才写道,
xlswrite('name.xls', MatObj.interesting, 1, 'A1');
[~, ~, list] = xlsread('name.xls'); % later on
或者如果您更喜欢文字,
% I'm assuming here that it's just a single list of text strings.
fid = fopen('name.txt', 'w');
for row=1:nrows
fprintf(fid, '%s\n', MatObj.interesting{row});
end
fclose(fid);
然后用fscanf
打开。我只使用xlswrite
。我从来没有遇到任何问题,而且它的速度不足以让我不喜欢使用它。我知道我的答案只是一种解决方法而不是真正的解决方案,但我希望它有所帮助。
答案 1 :(得分:1)
我没有matfile
的经验,所以我无法帮助你。作为一个快速而肮脏的解决方案,我只想将文件名写入两个不同的文本文件。快速测试表明数据会立即刷新到磁盘,即使您关闭了matlab而没有执行fclose(模拟崩溃),文本文件也可以正常运行。未经测试的代码:
files = dir(directory);
K = numel(files);
boring = fopen('boring.txt', 'w');
interesting = fopen('interesting.txt', 'w');
for k=1:K
load(files(k).name,'data')
metric = testfunction(data)
if metric < threshold
fprintf(boring, '%s\n', files(k).name);
else
fprintf(interesting, '%s\n', files(k).name);
end
end
%be nice and close files
fclose(boring);
fclose(interesting);
之后处理枯燥/有趣的文本文件应该是微不足道的。如果您还要在开始循环之前将目录列表写入单独的文件,那么在发生崩溃时应该非常容易(手动或自动)找出继续的位置。