1

我有一个看起来像这样的大文件:

Heading1
1 ABC
2 DEF
Heading2
1 GHI
2 JKL
3 MNO
Heading3
1 PQR
2 STU

标题始终具有相同的模式,但每个标题下方的条目不同(条目数量不同,没有共同模式,字母/单词数量不同)。

我想将一个列表拆分为多个列表,即每个标题都有一个新列表。如果有人能指出我如何解决这个问题的正确方向,那就太好了。

干杯!

编辑:忘记包括如何将每个新列表保存为具有文件名 = 标题的单独文件?

最终解决方案,感谢@Nate


## input

test <- list("Heading1", "1 ABC", "2 DEF", "Heading2", "1 GHI", "2 JKL", "3 MNO", "Heading3", "1 PQR", "2 STU")

## split list into list of lists

header_positions <- grepl("^Heading", test)

grouping_index <- cumsum(header_positions)

li <- split(test[!header_positions], grouping_index[!header_positions])

setNames(li, test[header_positions]) # Yes to fancy names ;)

## save each list

for(n in names(li)) {
  writeLines(unlist(li[[n]]), paste0("heading ",n))
} 
4

2 回答 2

1

你能试试这个吗?

mylist = list("Heading1", "1 ABC", "2 DEF", "Heading2", "1 GHI", "2 JKL", "3 MNO", "Heading3", "1 PQR", "2 STU")
idx = unlist(lapply(mylist, function(x) as.numeric(regexpr("heading", x, ignore.case=T))))
idx[which(idx == -1)] = 0
idx = cumsum(idx)
myotherlist = vector("list", max(idx))
for (i in 1:length(mylist)) myotherlist[[idx[i]]] = append(myotherlist[[idx[i]]], mylist[i])
于 2020-07-29T22:00:00.023 回答
1

这就是我要做的:

header_positions <- grepl("^Heading", test)
header_positions

grouping_index <- cumsum(header_positions)
grouping_index

li <- split(test[!header_positions], grouping_index[!header_positions])
li

setNames(li, test[header_positions]) # if you want to have fancy names :)

我认为该cumsum(grepl(...))模式对于这种列表拆分任务非常有用。

如果要通过以下方式写出,writeLines()则需要将列表元素转换为character向量unlist()

for(n in names(li)) {
  writeLines(unlist(li[[n]]), paste0(n, ".txt"))
} 

这是迭代列表名称的另一种有用模式,因此您可以直接访问名称(对于文件名)并使用它们来索引列表(对于文件内容)。

于 2020-07-29T22:26:30.113 回答