readLines
возвращает вектор, а не фрейм данных, поэтому мы можем создать образец ввода более просто:
sample = c("*Keyword",
"*Node",
"$ Node,X,Y,Z",
"1,639982.78040607,4733827.5104821,0",
"2,639757.59709573,4733830.43494066,0",
"3,639738.81268144,4733834.3619618,0",
"*End")
Найдите начальный и конечный заголовки и удалите элементы между ними с отрицательной индексацией:
node = which(sample == "*Node")
end = which(sample == "*End")
result = sample[-seq(from = node + 1, to = end - 1)]
result
# [1] "*Keyword" "*Node" "*End"
Предполагается, что есть одна *Node
и одна *End
строка. Также предполагается, что есть хотя бы одна строка для удаления. Возможно, вы захотите создать более надежное решение с некоторой обработкой для этих особых случаев, например,
delete_between = function(input, start, end) {
start_index = which(sample == start)
end_index = which(sample == end)
if (length(start_index) == 0 | length(end_index) == 0) {
warning("No start or end found, returning input as-is")
return(input)
}
if (length(start_index) > 1 | length(end_index) > 1) {
stop("Multiple starts or ends found.")
}
if (start_index == end_index - 1) {
return(input)
}
return(input[-seq(from = start_index + 1, to = end_index - 1)])
}