我正在使用的软件生成具有可变行数的摘要信息后跟大量制表符分隔数据的日志文件。我正在尝试编写一个函数,将这些日志文件中的数据读取到数据框中,并忽略摘要信息。摘要信息从不包含制表符,因此以下函数有效:
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
之间遇到错误时,连接将保持打开状态。 - Marek