所以我有一堆需要解析的数据。它采用以下格式:
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不是文本墙会很棒。
谢谢大家
答案 0 :(得分:0)
好的,所以通过足够的修修补补,我找到了办法。
我使用%3c
代替%s
来获取原子值,这意味着输出字符串的长度始终是列表中原子数的3倍。然后,这是一个简单的循环来检查B(i) = C
,B(i + 1) = A
和B(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))