我有一个相当奇怪的文件格式需要阅读。它有以空格分隔的列,但列宽必须从标题中推断出来。
此外,还有一些必须忽略的虚假行,包括空白行和非空白行。
数据的表示:
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
包含从1
in之后的下一个字符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
}
一定会有更好的办法。
要忽略的行是这个难题的一小部分。我将接受一种适用于已从文件中删除的解决方案(但当然更喜欢不需要预处理的解决方案)。