如何在R中以制表符分隔的分隔文件的标题之前跳过额外的行

时间:2010-06-16 12:13:41

标签: r csv delimiter

我使用的软件生成日志文件,其中包含可变数量的摘要信息行,后跟大量制表符分隔数据。我正在尝试编写一个函数,将这些日志文件中的数据读入数据框,忽略摘要信息。摘要信息从不包含选项卡,因此以下功能有效:

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对上述功能的进一步改进。

2 个答案:

答案 0 :(得分:1)

您不需要阅读两次。在第一个结果上使用textConnection

read.parameters <- function(file.name, ...){
  lines <- scan(file.name, what="character", sep="\n") # you got "tmp.log" here, i suppose file.name should be
  first.line <- min(grep("\\t", lines))
  return(read.delim(textConnection(lines), skip=first.line-1, ...))
}

答案 1 :(得分:0)

如果您可以确定标题信息不会超过N行,例如N = 200,然后尝试:

扫描(...,nlines = N)

这样你就不会重读超过N行。