0

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

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 xn 矩阵。

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

B = fscanf(fid, '%*13c %s %*64c \n');

这在我收到信件的范围内有效。唯一的问题是我把它们放在一堆文本中:

B = NCAC.... etc.

而不是作为列向量或数组。

真的,我只需要它们来提取我需要的浮点值,如果有办法使用 fscanf 做到这一点,那么这是可取的,否则某种方式让 B 不是文本墙会很棒。

谢谢大家

4

2 回答 2

0

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

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

于 2012-09-14T05:11:14.577 回答
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);

这仅取决于字段的数量,而不是它们的宽度。然后,要仅获取标记为 的字段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))
于 2012-09-14T06:54:49.930 回答