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)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 = Lines
和textConnection(Lines)
。
read.table(text = Lines,
skip = grep("##XYDATA=", readLines(textConnection(Lines))))
新增一些修订,并加入第二种方法。
谢谢你的回答。你的第二种方法很好地工作! – 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)
谢谢你的回答!但是,这种方法在检测类型时会在第2行返回一个错误“ends field 1:## END =',无论我在'skip ='中给出什么值或提名。 – 2014-09-05 07:56:20
听起来特定文件,请参阅我的答案中的编辑,了解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
阅读该文件。使用这种方法,您不会将整个文件存储在内存中,而只是存储您需要的一部分。
谢谢你的回答! – 2014-09-11 06:41:57
还有更多的文件,你的问题从我的帖子中提到了一个以## END ='开始的行,是坐标行之后的那一行吗? – JeremyS 2014-09-08 01:10:03
是。也许我应该将'nrow ='并入参数行? – 2014-09-08 05:56:57