【发布时间】:2011-03-04 10:39:52
【问题描述】:
我使用的软件生成的日志文件包含可变数量的摘要信息行,后跟大量制表符分隔的数据。我正在尝试编写一个函数,它将这些日志文件中的数据读取到忽略摘要信息的数据框中。摘要信息从不包含选项卡,因此以下功能起作用:
read.parameters <- function(file.name, ...){
lines <- scan(file.name, what="character", sep="\n")
first.line <- min(grep("\\t", lines))
return(read.delim(file.name, skip=first.line-1, ...))
}
但是,这些日志文件非常大,因此两次读取文件非常慢。肯定有更好的方法吗?
编辑添加:
Marek 建议使用textConnection 对象。他在答案中建议的方式在大文件上失败,但以下工作:
read.parameters <- function(file.name, ...){
conn = file(file.name, "r")
on.exit(close(conn))
repeat{
line = readLines(conn, 1)
if (length(grep("\\t", line))) {
pushBack(line, conn)
break}}
df <- read.delim(conn, ...)
return(df)}
再次编辑:感谢 Marek 对上述功能的进一步改进。
【问题讨论】:
-
为了安全地关闭连接,您可以使用
on.exit函数。在conn=file(...)之后添加行on.exit(close(conn))。然后当一个函数完成一个任务(通常或有错误)时,连接将被关闭。否则,当您在file和close之间出现错误时,连接将打开。 -
谢谢,好技术。我已经更新了。