在单元格MATLAB中检查字符串的存在性

在单元格MATLAB中检查字符串的存在性,matlab,datetime,serial-port,Matlab,Datetime,Serial Port,我的数据如下: 这是来自串行端口的采样数据顺序,即将出现: % date:2016-08-05, time:10:05:23, t1:82.55,h1:85.60,t2:62.55,h2:65.60, % date:2016-08-05, time:10:05:24, p1:20,p2:35, % date:2016-08-05, time:10:05:25, p1:35,p2:21, % date:2016-08-05, time:10:05:26, t1:45,h1:65.60,t2

我的数据如下: 这是来自串行端口的采样数据顺序,即将出现:

% date:2016-08-05, time:10:05:23,  t1:82.55,h1:85.60,t2:62.55,h2:65.60,
% date:2016-08-05, time:10:05:24,  p1:20,p2:35,
% date:2016-08-05, time:10:05:25,  p1:35,p2:21,
% date:2016-08-05, time:10:05:26,  t1:45,h1:65.60,t2:75.55,h2:65.60,


rdstr='date:2016-08-05, time:10:05:23,  t1:82.55,h1:85.60,t2:62.55,h2:65.60,'
现在,我想得到矩阵var1和var2的数据

var1= [datetime t1 t2;
        datetime t1 t2]...

var2= [datetime p1 p2;
       datetime p1 p2]...
注意:readstr是一次读取一行的串行数据。
var1 datetime必须在其特定的采样时间。

由于我没有完整的文件,我将使用您提供的数据片段,我将创建一个单元格数组(而不是txt文件),我们将逐行读取该数组

LINES={'date:2016-08-05, time:10:05:23,  t1:82.55,h1:85.60,t2:62.55,h2:65.60';
'date:2016-08-05, time:10:05:24,  p1:20,p2:35';
'date:2016-08-05, time:10:05:25,  p1:35,p2:21';
'date:2016-08-05, time:10:05:26,  t1:45,h1:65.60,t2:75.55,h2:65.60'};
现在我们将
var1
var2
初始化为空变量:

var1=[];
var2=[];
现在我们使用for循环逐行(即逐行)读取单元格数组
(即您的文件)。然后,我们将使用
strfind()
检查是否在要检查的行中找到给定的字符串(
t1
p1
)。最后,由于数据是以逗号分隔的,我们将使用带有逗号分隔符的
strsplit()
来填充
var1
var2

for i=1:size(LINES,1)
    if strfind(LINES{i},'t1')
        var1=[var1 ; strsplit(LINES{i},',')];
    elseif strfind(LINES{i},'p1') || strfind(LINES{i},'p2')
        var2=[var2 ; strsplit(LINES{i},',')];
    else
        fprintf('t1/p1/p2 not found in i-th cell.\n');
    end
end
var1=cellfun(@(x) x(strfind(x,':')+1:end),var1,'UniformOutput',false);
var2=cellfun(@(x) x(strfind(x,':')+1:end),var2,'UniformOutput',false);
变量
var1
var2
的形式分别为

最后,如果您想去掉
var1
var2
中的
date
time
p1
(等等)字符串:

for i=1:size(LINES,1)
    if strfind(LINES{i},'t1')
        var1=[var1 ; strsplit(LINES{i},',')];
    elseif strfind(LINES{i},'p1') || strfind(LINES{i},'p2')
        var2=[var2 ; strsplit(LINES{i},',')];
    else
        fprintf('t1/p1/p2 not found in i-th cell.\n');
    end
end
var1=cellfun(@(x) x(strfind(x,':')+1:end),var1,'UniformOutput',false);
var2=cellfun(@(x) x(strfind(x,':')+1:end),var2,'UniformOutput',false);
var1
var2
将分别具有以下格式:

如果您不需要
var1
h1
h2
值,您可以通过以下方式删除这些列:

var1(:,[4 6])=[];
更新:文件版本

% open txt file
fID=fopen('data.txt');

% init var1 and var2
var1=[];
var2=[];

% fetch 1st line
tline = fgets(fID);

while ischar(tline)
    % remove leading '% ', remove newline return and the last comma
    rdstr=tline(3:end-2);

    % same as above
    if strfind(rdstr,'t1')
        var1=[var1 ; strsplit(rdstr,',')];
    elseif strfind(rdstr,'p1') || strfind(rdstr,'p2')
        var2=[var2 ; strsplit(rdstr,',')];
    else
        fprintf('t1/p1/p2 not found in i-th cell.\n');
    end

    % fetch new line
    tline = fgets(fID);
end

fclose(fID);

其中,
data.txt
的结构与数据片段相同,
var1
var2
的结构如前两幅图所示。如果要删除字符串
date
time
等,则需要如上所述使用
cellfun()

rdstr
不是单元格,而是示例中的矩阵。同样,关于什么是
var1
var2
也不清楚,我想您确实希望根据t1/p1/p2来连接
rdstr
中的字符串,对吗?@alesiox rdstr是我从串行端口的fgets()中得到的矩阵。在这里,我只想显示我的示例中第一个字符串后面的下一行。如果您使用的是矩阵,请从标题中删除“cell”引用。此外,您的矩阵似乎只有一行,所有的
datetime
都连接在一起。是它还是它只是一个小的输入错误,你实际上希望每行有一个datetime,这样你就可以逐行扫描矩阵?@Alessiox rdstr是我从串行端口的fgets()中得到的矩阵。在这里,我只想显示示例中第一个字符串之后的下一行。var1_是一个矩阵,其中包含datetime(数值)和t1(数值)的数据。var2是矩阵datetime(数值)和p1 p2(数值)的值。我仍然不能完全理解
rdstr
的结构。是一行还是三行,每次一行?字符串分隔符和逗号有问题。请修复它。@Allessiox但当我用fgets()或fscanf()获取数据时,行是字符数组而不是单元格。@MaK正确。但是,我们逐行读取这个单元格数组,其中泛型行是
行{i}
,而
行{i}
是一个字符数组,就像变量
rdstr
;)但是当我运行脚本时,出现了以下错误:_cellcontents引用非Cell数组对象。_如果strfind(第{I},'t1')@MaK行,我想您是从一个文件读取的,该文件(同样,我想)是一个txt文件。您不需要单元格数组(您没有单元格数组,这就是错误的原因),这只是我用来模拟txt文件的一种方式,因为我没有它。您必须更改for循环(甚至可以使用while循环)并逐行读取文件,而不是单元格数组。逐行阅读文件,调用
rdstr
通用文件行,并用
rdstr
替换
行{i}
@MaK。我已经用txt文件方法编辑了答案。