R - 在特定行后读取.txt文件中的行

问题描述:

我有一堆输出.txt文件,它由大型参数列表和X-Y坐标集组成。我需要从所有文件中提取这些坐标,以便只将这些行导入到矢量中。这将很好地工作R - 在特定行后读取.txt文件中的行

impcoord<-read.table("file.txt",skip= ,nrow= ,...) 

但文件支持参数的不同长度后打印的坐标集。

幸运的是,坐标始终在包含某些单词的行后面开始。

因此,我的问题是,如何在这些字词之后开始阅读.txt文件?假设他们是:

coordinatesXY 

非常感谢您的时间和帮助!

-Olli

- 编辑 -

很抱歉的混乱。

该文件的部分如下:

##XYDATA= (X++(Y..Y)) 
131071 -2065 
131070 -4137 
131069 -6408 
131068 -8043 
...  ... 
...  ... 

第一行是所述一个其中skip应该结束并下列坐标需要被导入到载体中。正如你所看到的X坐标从131071开始和结束时0

+1

还有更多的文件,你的问题从我的帖子中提到了一个以## END ='开始的行,是坐标行之后的那一行吗? – JeremyS 2014-09-08 01:10:03

+0

是。也许我应该将'nrow ='并入参数行? – 2014-09-08 05:56:57

1)read.patternread.pattern gsubfn可以用来只读取符合特定模式的行。在这个例子中,我们匹配行首,可选空间,一个或多个数字,一个或多个空格,一个可选的减号,后跟一个或多个数字,可选空间,行尾。匹配regexp的括号化部分的部分作为data.frame中的列返回。 text = Lines在这个自包含的示例中可以替换为"myfile.txt",比方说,如果数据来自文件。修改适合的模式。

Lines <- "junk 
junk 
##XYDATA= (X++(Y..Y)) 
131071 -2065 
131070 -4137 
131069 -6408 
131068 -8043" 

library(gsubfn) 
DF <- read.pattern(text = Lines, pattern = "^ *(\\d+) +(-?\\d+) *$") 

,并提供:

> DF 
     V1 V2 
1 131071 -2065 
2 131070 -4137 
3 131069 -6408 
4 131068 -8043 

2)仅使用基础R读两次另一种可能性是简单地读取一次它以确定的skip=的值和第二时间使用到执行实际读那个价值。从文件中读取myfile.txt"myfile.txt"替换text = LinestextConnection(Lines)

read.table(text = Lines, 
    skip = grep("##XYDATA=", readLines(textConnection(Lines)))) 

新增一些修订,并加入第二种方法。

+0

谢谢你的回答。你的第二种方法很好地工作! – 2014-09-08 06:31:24

这看起来像一个工作为的fread

library(data.table) 
impcoord <- fread("file.txt",skip="coordinatesXY") 

- 编辑 -

data.table这就是为什么它给出一个可重复的例子是很好的。该错误意味着您的文件正在造成麻烦。

skip命令将您给它的文本与文件相匹配,以确定要开始的行,因此您需要从行的开头为它开始读取一个唯一的字符串。该函数将工作是这样的:

## some random text 
## some more random text 
## More random text 
table_heading1, table_heading2, table_heading3 ...etc 
value1, value2, value3 ... etc 
etc 

Just_The_Table <- fread("the_above_as_a_text_file.txt", skip="table_heading1", header=T) 
+0

谢谢你的回答!但是,这种方法在检测类型时会在第2行返回一个错误“ends field 1:## END =',无论我在'skip ='中给出什么值或提名。 – 2014-09-05 07:56:20

+0

听起来特定文件,请参阅我的答案中的编辑,了解fread跳过如何工作的示例。 – JeremyS 2014-09-05 08:34:23

一个可能的办法是以下几点:

 conn<-file("file.txt",open="rt") 
    x<-TRUE 
    while (x) 
     {x<-!grepl("coordinatesXY",readLines(conn,n=1))} 
    ret<-read.table(conn,...) #insert additional parameters to read.table 
    close(conn) 

您在输入文件时读取一个行且停,当你发现的指标串。然后您通过read.table阅读该文件。使用这种方法,您不会将整个文件存储在内存中,而只是存储您需要的一部分。

+0

谢谢你的回答! – 2014-09-11 06:41:57