我试图将文本文件整理到它包含的文章中。通常这是通过识别每篇文章开头的模式来完成的。不幸的是,我下载文章的数据库并没有。我能找到的唯一模式是每篇文章后有3个空行。
我怎样才能确定连续三条空行? 我知道我可以找到空行:
Beginnings <- grep('^$', Lines.i)
然后看起来像
> Beginnings[1:50]
[1] 1 2 3 6 8 10 12 13 40 41 42 43 45 49 50 51 53 54 62 63 64 65 67
[24] 69 70 110 111 112 113 115 117 121 122 123 125 131 132 133 135 137 138 150 151 152 153 155
[47] 157 158 169 170
您可以看到第一篇文章在1 2 3之后开始,而下一篇文章在41 42 43之后开始。
所以我的想法是将新行表达式添加到模式
Beginnings <- grep('^$\n^$\n^$\n', Lines.i)
但这不起作用。我会很感激任何建议!
答案 0 :(得分:2)
您可以尝试rle
which(inverse.rle(within.list(rle(!nzchar(v1)),
values[lengths<3 & values] <- FALSE)))
#[1] 3 4 5 9 10 11 12
v1 <- c('ard', 'b', '', '', '', 'rr', '', 'fr', '', '', '', '', 'gh', 'd')
答案 1 :(得分:1)
这是一个仅提取文章行的解决方案。变得比我希望的更加复杂和神秘,但我确信它有效。另外,感谢akrun提供的测试数据。
v1 <- c('ard','b','','','','rr','','fr','','','','','gh','d');
ind <- with(rle(c(rep(F,3),nzchar(v1),rep(F,3))),data.frame(start=cumsum(lengths[-length(lengths)])[values[-1]&!values[-length(values)]&lengths[-length(values)]>=3]-2,end=cumsum(lengths[-length(lengths)])[values[-length(lengths)]&!values[-1]&lengths[-1]>=3]-3));
articles <- lapply(1:nrow(ind),function(r) v1[ind[r,'start']:ind[r,'end']]);
v1;
## [1] "ard" "b" "" "" "" "rr" "" "fr" "" "" "" "" "gh" "d"
ind;
## start end
## 1 1 2
## 2 6 8
## 3 13 14
articles;
## [[1]]
## [1] "ard" "b"
##
## [[2]]
## [1] "rr" "" "fr"
##
## [[3]]
## [1] "gh" "d"