读取文本文件中由R中的标识符分隔的一大块行的最佳/最快方法

时间:2017-12-11 16:09:50

标签: r parsing text

我有一个文本文件,其中每一行都以已知的字符标识符开头(*是分隔符):

AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
.
.
.
ZZZ*123456789*.*.*.

问题是即使信息是以这种方式组织的。从AAA到ZZZ的每一行代表该特定数据中的一条记录。因此,在ZZZ线之后,数据再次返回到ZZZ的AAA。

除了使用for循环和逐行处理之外,还有一种方法可以将从AAA到ZZZ的行块取出并基本上将它放在一行上,这样我可以在之后用分隔符分隔出每一行吗?

或者,如果您对处理此类数据有任何其他建议,请与我们联系。

谢谢,

2 个答案:

答案 0 :(得分:1)

我们可以使用tapplypaste元素

tapply(lines, cumsum(grepl("^AAA", lines)), FUN = paste, collapse="")

也没有使用包

数据

lines <- readLines(textConnection("AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
ZZZ*123456789*.*.*.
AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
ZZZ*123456789*.*.*."))

答案 1 :(得分:0)

使用最后注释中的示例数据将其读入数据框,创建分组变量g,然后使用reshape将其从长格式转换为宽格式。没有使用包裹。 text=Lines可以替换为文件名,例如"myfile",如果输入来自文件。

DF <- read.table(text = Lines, sep = "*", as.is = TRUE, strip.white = TRUE)
DF$g <- cumsum(DF$V1 == "AAA")
reshape(DF, dir = "wide", idvar = "g", timevar = "V1")

注意:

Lines <- "AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*."