1

我有一个相当奇怪的文件格式需要阅读。它有以空格分隔的列,但列宽必须从标题中推断出来。

此外,还有一些必须忽略的虚假行,包括空白行和非空白行。

数据的表示:

The first line contains some text that is not important, and shoud be ignored.
The second line also.  In addition, the third and fifth lines are blank.

       col1          col2    col3  col4     col5

  ab   cd e      132399.4     101     0 17:25:24  Ignore anything past the last named column
       blah        773411      25    10 17:25:25  Ignore this too

这里,第一列 ,col1包含从行首到文本字符串结尾的字符位置的文本col1。第二列col2包含从1in之后的下一个字符col1到文本字符串结尾的文本col2。等等。

实际上,有 17 列而不是 5 列,但这不应该改变代码。

我正在寻找包含以下内容的数据框:

         col1     col2 col3 col4      col5
1   ab   cd e 132399.4  101    0  17:25:24
2        blah 773411.0   25   10  17:25:25

这是一个相当不优雅的方法:

read.tt <- function(file) {
  con <- base::file(file, 'r')
  readLines(con, n=3);
  header <- readLines(con, n=1)
  close(con)
  endpoints <- c(0L, gregexpr('[^ ]( |$)', header)[[1]])
  widths <- diff(endpoints)
  names <- sapply(seq_along(widths),
                  function(i) substr(header, endpoints[i]+1, endpoints[i]+widths[i]))
  names <- sub('^ *', '', names)
  body <- read.fwf(file, widths, skip=5)
  names(body) <- names
  body
}

一定会有更好的办法。

要忽略的行是这个难题的一小部分。我将接受一种适用于已从文件中删除的解决方案(但当然更喜欢不需要预处理的解决方案)。

4

1 回答 1

0

如果您知道标题行,则可以使用以下方法获取宽度。

x
## [1] "         col1     col2 col3 col4      col5"

nchar(unlist(regmatches(x, gregexpr("\\s+\\S+", x))))
## [1] 13  9  5  5 10
于 2013-04-19T02:39:28.720 回答