R:根据特定模式从文本文件(例如sdf)中提取部分内容?

时间:2014-04-15 01:31:42

标签: r

[A]
66 67  1  0  0  0  0
67 69  2  0  0  0  0
67 71  1  0  0  0  0
68 69  1  0  0  0  0
72 73  2  3  0  0  0
72 74  1  0  0  0  0
M  END
> <DRUGBANK_ID>
DB00035
> <ALOGPS_SOLUBILITY>
1.10e-01 g/l
$$$$

[B]
66 67  1  0  0  0  0
67 69  2  0  0  0  0
67 71  1  0  0  0  0
68 69  1  0  0  0  0
72 73  2  3  0  0  0
72 74  1  0  0  0  0
M  END
> <DRUGBANK_ID>
DB00036
> <ALOGPS_SOLUBILITY>
1.10e-01 g/l
$$$$

[C]
66 67  1  0  0  0  0
67 69  2  0  0  0  0
67 71  1  0  0  0  0
68 69  1  0  0  0  0
72 73  2  3  0  0  0
72 74  1  0  0  0  0
M  END
> <DRUGBANK_ID>
DB00039
> <ALOGPS_SOLUBILITY>
1.10e-02333
$$$$

我有上面的sdf文件,我想提取那些包含DRUGBANK_ID = DB00035和DB00039的行,这意味着我要提取[A]和[C]内容。每个文件以$$$$结尾。在我的sdf文件中包含7000多种这样的格式,提取我想要的模式的有效方法是什么?谢谢。

[A]
66 67  1  0  0  0  0
67 69  2  0  0  0  0
67 71  1  0  0  0  0
68 69  1  0  0  0  0
72 73  2  3  0  0  0
72 74  1  0  0  0  0
M  END
> <DRUGBANK_ID>
DB00035
> <ALOGPS_SOLUBILITY>
1.10e-01 g/l
$$$$

[C]
66 67  1  0  0  0  0
67 69  2  0  0  0  0
67 71  1  0  0  0  0
68 69  1  0  0  0  0
72 73  2  3  0  0  0
72 74  1  0  0  0  0
M  END
> <DRUGBANK_ID>
DB00039
> <ALOGPS_SOLUBILITY>
1.10e-02333
$$$$

1 个答案:

答案 0 :(得分:1)

读入行并创建一个分组变量g.all,其中包含文件每行的组件。也就是说,对于第一组的每一行,它是1,对于第二组的每一行,它是2,依此类推。确定每个所需字符串所在的组g.ok,然后从这些组中提取所有行:

L <- readLines("myfile")
g.all <- cumsum(grepl("^\\[", L))
g.ok <- g.all[grep("DB00035|DB00039", L)]
L[g.all %in% g.ok]

已添加要使用$$$$作为标记,请将第二行替换为:

g.all <- rev(cumsum(grepl("$$$$", rev(L), fixed = TRUE)))