Matlab fscanf输出文本块而不是数组

Matlab fscanf输出文本块而不是数组,matlab,file-io,octave,scanf,Matlab,File Io,Octave,Scanf,所以我有一堆需要解析的数据。它的格式如下: ATOM 1 N VAL A 1 5.287 16.725 4.830 1.00 77.31 N ATOM 2 CA VAL A 1 5.776 17.899 5.595 1.00 70.91 C ATOM 3 C VAL A 1 7.198 18.266 5.104 1.00 81.7

所以我有一堆需要解析的数据。它的格式如下:

ATOM      1  N   VAL A   1       5.287  16.725   4.830  1.00 77.31           N   
ATOM      2  CA  VAL A   1       5.776  17.899   5.595  1.00 70.91           C  
ATOM      3  C   VAL A   1       7.198  18.266   5.104  1.00 81.71           C  
等等

我只需要前3个浮点数,可以使用

A = fscanf(fid, '%*30c %f %f %f %*26c \n', [3, inf]);
它返回一个包含这些值的3 x n矩阵

问题是我只需要原子为“CA”的值。我尝试过类似的方法来提取此部分,如下所示:

B = fscanf(fid, '%*13c %s %*64c \n');
这在我收到信的程度上起作用。唯一的问题是我把它们放在一堆文本中:

B = NCAC.... etc.
而不是作为列向量或数组

实际上,我只需要它们来提取我需要的浮点值,如果有一种方法可以使用fscanf来实现这一点,那就更好了,否则,让B不是一堵文本墙的某种方法将是惊人的


谢谢大家

好的,经过足够的修补,我找到了一种方法


我使用
%3c
而不是
%s
来获取原子值,这意味着输出字符串的长度始终是列表中原子数的3倍。然后它是一个简单的循环来检查
B(i)=C
B(i+1)=a
B(i+2)='
,,而不是依赖前几个字段总是相同的宽度,我会使用更灵活的方法,例如:

fid = fopen('your_data.txt', 'r');

A = textscan(fid, '%*s%*s%*s%*s%*s%*s %f %f %f %*f%*f%*s',...
        'MultipleDelimsAsOne', true);

fclose(fid);
这只取决于字段的数量,而不是其宽度。然后,要仅获取标记为
CA
的字段,请使用

fid = fopen('your_data.txt', 'r');

A = textscan(fid, '%*s%*s %s %*s%*s%*s %f %f %f %*f%*f%*s',...
        'MultipleDelimsAsOne', true);

fclose(fid);

A = cellfun(@(x) x( strcmp(A{1}, 'CA') ), A(2:end))