Как пропустить дополнительные строки перед заголовком файла с разделителями табуляции в R - PullRequest
3 голосов
/ 16 июня 2010

Программное обеспечение, которое я использую, создает файлы журнала с переменным количеством строк сводной информации, за которой следует множество данных с разделителями табуляции.Я пытаюсь написать функцию, которая будет считывать данные из этих файлов журнала во фрейм данных, игнорируя сводную информацию.Сводная информация никогда не содержит вкладки, поэтому работает следующая функция:

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, ...))
}

Однако эти файлы журналов довольно велики, поэтому чтение файла дважды происходит очень медленно.Конечно, есть лучший способ?

Отредактировано, чтобы добавить:

Марек предложил использовать объект 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)}

Повторно отредактировано: Спасибо Мареку за дальнейшее улучшение вышеуказанной функции.

Ответы [ 2 ]

1 голос
/ 16 июня 2010

Вам не нужно читать дважды. Используйте 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, ...))
}
0 голосов
/ 17 июня 2010

Если вы уверены, что информация заголовка не будет превышать N строк, например N = 200, попробуйте:

scan (..., nlines = N)

Таким образом, вы не будете перечитывать больше, чем N строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...