fscanf输出文本blob而不是数组

时间:2012-09-14 03:08:11

标签: 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.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不是文本墙会很棒。

谢谢大家

2 个答案:

答案 0 :(得分:0)

好的,所以通过足够的修修补补,我找到了办法。

我使用%3c代替%s来获取原子值,这意味着输出字符串的长度始终是列表中原子数的3倍。然后,这是一个简单的循环来检查B(i) = CB(i + 1) = AB(i + 2) = ' '

答案 1 :(得分:0)

我没有依赖前几个总长度相同的字段,而是使用更灵活的方法,例如:

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);

这仅依赖于数字字段,而不是 width 。然后,要仅获取标记为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))