首先以可重复的方式定义测试数据——我们使用了问题中显示的数据的两个实例。我们注意到棘手的部分是每条记录在问题中运行超过 1 行。
读入Lines——用真实数据替换textConnection(Lines),这是为了保持代码自包含,比如"myfile.txt"。
然后第一个 sub 在每行的开头插入一个空格,第二个替换所有包含 LENGTH: 的行上的所有内容,包括 LENGTH: 和换行符、DATE:、日期和 LENGTH:。 gsub 在每个关键字之前插入一个换行符,paste 将其全部折叠成一个大的换行符分隔字符串。 strsplit再次拆分它,以便我们添加的换行符生效。
数据现在是 DCF 格式,因此我们可以使用 read.dcf 读取它。 DCF 格式用一个或多个空行分隔记录,并以字段名后跟冒号和空格后跟值开始每个字段。如果后续行缩进,则该值可以运行到多行,例如以空格开头。
这给出了一个包含 5 列的矩阵。最后一个sub 删除每个元素末尾的逗号,最后一个gsub 用空格替换换行符。
请注意,我们已将字段放在列中,这通常是在 R 中表示数据的方式,但如果您真的希望将其放在行中,请使用 t(dcf)。
# test data
Lines <- "December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm
development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~
December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm
development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~"
# code
L0 <- readLines(textConnection(Lines))
L <- sub("^", " ", L0)
L <- sub("(.*) LENGTH:", "\nDATE: \\1 LENGTH:", L)
L <- gsub("(\\w+:)", "\n\\1", L)
L <- paste(L, collapse = "\n")
L <- unlist(strsplit(L, "\n"))
dcf <- read.dcf(textConnection(L))
dcf[] <- sub(",$", "", dcf)
dcf[] <- gsub("\n", " ", dcf)
这给出了以下 5 列字符矩阵:
> dcf
DATE LENGTH
[1,] "December 4, 2016 Sunday" "1070 words"
[2,] "December 4, 2016 Sunday" "1070 words"
HEADLINE BYLINE
[1,] "Korea presents new farm development model globally" "By Yoon Ja-young"
[2,] "Korea presents new farm development model globally" "By Yoon Ja-young"
BODY
[1,] "~~~"
[2,] "~~~"
更新:添加日期输出。