我有一堆输出.txt文件,它们包含一个大参数列表和一个X-Y坐标集。我需要从所有文件中提取这些坐标,以便只将这些行导入到矢量中。这适用于
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.
答案 0 :(得分:7)
1)gsubfn中的read.pattern read.pattern
可用于只读取与特定模式匹配的行。在此示例中,我们匹配行的开头,可选空格,1个或多个数字,1个或多个空格,可选的减号后跟1个或多个数字,可选空格,行尾。匹配正则表达式的括号部分的部分作为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
中读取,请将text = Lines
和textConnection(Lines)
替换为"myfile.txt"
。
read.table(text = Lines,
skip = grep("##XYDATA=", readLines(textConnection(Lines))))
已添加部分修订并添加了第二种方法。
答案 1 :(得分:5)
这看起来像是data.table
的{{1}}
fread
- 编辑 -
这就是为什么给出一个可重复的例子是好的。该错误意味着您的文件导致了问题。
skip命令将您提供给文件的文本与文件进行匹配,以确定要从哪个行开始,因此您需要从该行的开头为其提供一个唯一的字符串,您希望它从中开始读取。该功能适用于以下内容:
library(data.table)
impcoord <- fread("file.txt",skip="coordinatesXY")
答案 2 :(得分:1)
可能的方法如下:
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
阅读该文件。使用这种方法,您不会将整个文件存储在内存中,而只是存储在您需要的文件中。