我有100个传感器测量文件,其中包含测量的日期和时间。所有文件都有包含日期和时间的名称。例如:
07-06-2016_17-58-32.wf
07-06-2016_18-02-32.wf
...
...
08-06-2016_17:48-26.wf
我有一个函数(importfile)和一个导入我的数据的循环。循环看起来像这样:
Files = dir('C:\Osci\User\*.waveform');
numFiles = length(Files);
Data = cell(1, numFiles);
for fileNum = 1:numFiles
Data{fileNum} = importfile(Files(fileNum).name);
end
并非所有这些波形文件都有用。测量文件仅在特定时间段内生成时才有用。我有一张表显示我允许的时间段:
07-Jun-2016 18:00:01
07-Jun-2016 18:01:31
07-Jun-2016 18:02:01
...
我想修改我的循环,以便仅在天(第一个数字),小时(第四个数字)的数字时导入文件(.waveform文件) )和文件中的分钟(第5个数字)匹配包含允许时间段的表格的编号。
编辑:而不是标量小时,分钟和秒,每个都有一个向量。就我而言,MyDay,MyHour和MyMinute是1100x1矩阵,而fileTimes只包含361行。
因此,使用提供的示例,循环应该只导入文件
07-06-2016_18-02-32.wf
因为它是数字匹配的唯一一个(在本例中为7,18,02)。
EDIT2:使用@ erfan的回答(以及更改一些目录和变量名称)我有以下工作代码:
fmtstr = 'O:\\Basic_Research_All\\Lange\\Skripe ISAT\\Rohdaten\\*_%02i-*-*_%02i-%02i-*.wf';
Files = struct([]);
n = size(MyDayMyHourMyMinute);
for N = 1:n;
Files = [Files; dir(sprintf(fmtstr, MyDayMyHourMyMinute(N,:)))];
end
numFiles = length(Files);
WaveformData = cell(1, numFiles);
for fileNum = 1:numFiles
WaveformData{fileNum} = importfile(Files(fileNum).name);
end
答案 0 :(得分:2)
由于您的文件名很好地定义为日期和时间,因此您可以通过将列表转换为实际日期和时间来预过滤列表:
% Get the file list
Files = dir('C:\Osci\User\*.waveform');
% You only need the names
Files = {Files.name};
% Get just the filename w/o the extension
[~, baseFileNames] = cellfun(@(x) fileparts(x), Files, 'UniformOutput', false);
% Your filename is just a date, so parse it as such
fileTimes = datevec(baseFileNames, 'mm-dd-yyyy_HH-MM-SS');
% Now pick out the files you want
% goodFiles = fileTimes(:, 4) == myHour & fileTimes(:, 5) == myMinute & fileTimes(:, 6) == mySecond;
goodFiles = ismember(fileTimes(:, 4:6), [myHour(:), myMinute(:), mySecond(:)], 'rows');
% Pare down your list of filenames
Files = Files(goodFiles);
% Preallocate your data cell
Data = cell(1, numel(Files));
% Now do your loop
for idx = 1:numel(Data)
Data{idx} = importfile(Files{idx});
end
您当然需要定义myHour
,myMinute
和mySecond
。当然,使用goodFiles中的逻辑索引,您可以施加任何类型的时间条件,例如时间或日期范围。如果您发现文件名未定义得很好,则可以使用textscan
或strfind
解析文件名以获取所需的位。重要的是,单元格数组的索引方式与数字或字符串数组的索引方式大致相同,它通常更好地矢量化您的过滤条件,然后只对您必须的部分进行循环。
OP在下面的评论中指出,而不是标量小时,分钟和秒,每个都有一个向量。在这种情况下,使用ismember
匹配两个时间向量并返回逻辑索引向量。通过2015a,MathWorks引入了函数ismembertol
,允许用户在一定的容差范围内检查成员资格。
答案 1 :(得分:1)
您可以从头开始应用您的选择。假设天,小时和分钟的可接受值在acc
中保存为n*3
矩阵。如果用以下代码替换代码的第一行:
fmtstr = 'C:\Osci\User\%02i-*-*_%02i-%02i-*.wf';
Files = struct([]);
for ii = 1:n
Files = [Files; dir(sprintf(fmtstr, acc(ii,:)))];
end
然后您已将标准应用于Files
。其余的都一样。