从与关键字不同的文件中提取数据

时间:2014-10-17 21:53:54

标签: r grep

这是文件的一部分,

         GIAO CHEMICAL SHIELDING TENSOR (PPM):
                                                            ISOTROPIC
                      X             Y             Z         SHIELDING
                                                        (  ANISOTROPY )

1 C         X    192.9847       -0.3288        0.5647
            Y      0.8908      133.5254        1.9987
            Z     -1.5286        1.9986      131.2590
                                                             152.5897
 EIGENVALS:      192.9663      130.1130      134.6898
                                                        (     60.5649 )

2 O         X    293.7037      -11.3068       19.4099
            Y    -27.8836      337.6867      -38.0711
            Z     47.8680      -38.0711      380.8636
                                                             337.4180
 EIGENVALS:      283.3105      413.4345      315.5091
                                                        (    114.0247 )

3 H         X     32.4132       -2.6310       -3.6171
            Y     -0.9732       26.6966        2.2004
            Z     -1.6244        2.2423       28.7795
                                                              29.2964
 EIGENVALS:       34.4129       28.1896       25.2868
                                                        (      7.6748 )

4 H         X     32.4132        4.4443        0.5044
            Y      1.8931       30.1789        0.2675
            Z      0.0452        0.2257       25.2970
                                                              29.2964
 EIGENVALS:       34.4129       28.1895       25.2867
                                                        (      7.6748 )

5 H         X     31.3212       -2.3074        3.9610
            Y     -1.0235       26.9345       -1.8682
            Z      1.7569       -1.8682       29.0533
                                                              29.1030
 EIGENVALS:       33.8408       27.6219       25.8462
                                                        (      7.1067 )

6 H         X     32.4086       -3.5167        6.0369
            Y     -2.5502       27.9731       -8.1180
            Z      4.3777       -8.1180       37.1798
                                                              32.5205
 EIGENVALS:       29.5456       44.7719       23.2441
                                                        (     18.3770 )
 ..... DONE WITH NMR SHIELDINGS .....

我对这些线之间的数据感兴趣," GIAO CHEMICAL SHENSING TENSOR(PPM)"和" .....完成核磁共振屏蔽......"

我想变成一个数据框,

1C 152.5897  60.5649 
2O 337.4180  114.0247
3H 29.2964  7.6748
4H 29.2964  7.6748
5H 29.1030  7.1067
6H 32.5205  18.3770

我有其他这种性质的文件,但我不知道从哪里开始。好的,我可以使用readLines()将文件导入R,但之后......?

这是指向文件https://drive.google.com/file/d/0B2RulP80ivJaR0NVV1ZLRlpxVDA/view?usp=sharing的链接,而不仅仅是我的抓取。有些缩短版本的解决方案不适用于缩短版本的问题。处理完整的文件。

2 个答案:

答案 0 :(得分:3)

读入文件,提取以(可能是空的)空格序列开头的行和打开的parens后跟数字。然后在第二行粘贴每个这样的行的前3个字符和字符58-68并删除所有空格:

# extract portion of file between ix[1] and ix[2]
L <- readLines("myfile.dat")
ix <- grep("GIAO CHEMICAL SHIELDING TENSOR|DONE WITH NMR SHIELDING", L)
L0 <- L[seq(ix[1]+1, ix[2]-1)]

# extract fields
g <- grep("^[ (]*\\d", L0, value = TRUE)
res <- gsub(" ", "", paste(substr(g, 1, 3), substr(g, 58, 68)))

这给出了:

> res
[1] "1C"      "152.589" "60.564"  "2O"      "337.418" "114.024" "3H"     
[8] "29.296"  "7.674"   "4H"      "29.296"  "7.674"   "5H"      "29.103" 
[15] "7.106"   "6H"      "32.520"  "18.377" 

上面给出了所要求的内容,但您可能还想将其重塑为矩阵,

m <- matrix(res, ncol = 3, byrow = TRUE)

或data.frame,

data.frame(V1 = m[, 1], V2 = as.numeric(m[,2]), V3 = as.numeric(m[,3]))

答案 1 :(得分:1)

你也可以这样做:

 library(stringr)

 lines <- readLines("myfile.txt") #read the .txt file.

提取圆括号内的数字或数字后跟空格,后跟每行开头的字母。您可以使用正则表达式lookbehind来提取括号内的内容,即。 (?<=\\() +[0-9.+] - 声明(在空格之后立即先于数字,点。

 val1 <- na.omit(str_trim(str_extract(lines, perl("(?<=\\() +[0-9.]+|^\\d+ [A-Za-z]+"))))

创建一个逻辑索引,循环到val1的长度并提取第1,第3,第5个元素....

  indx <- c(TRUE, FALSE)

使用indx的{​​{1}}或!indx的元素提取为两列val1V1。对于V3,请查找V2之前的行并提取数字。

EIGENVALS