只有在包含表

时间:2016-10-14 11:56:40

标签: matlab import

我有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

2 个答案:

答案 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

您当然需要定义myHourmyMinutemySecond。当然,使用goodFiles中的逻辑索引,您可以施加任何类型的时间条件,例如时间或日期范围。如果您发现文件名未定义得很好,则可以使用textscanstrfind解析文件名以获取所需的位。重要的是,单元格数组的索引方式与数字或字符串数​​组的索引方式大致相同,它通常更好地矢量化您的过滤条件,然后只对您必须的部分进行循环。

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。其余的都一样。