Удалить все строки в файле, которые помещаются между определенными заголовками? - PullRequest
0 голосов
/ 07 января 2019

Я хотел бы удалить все строки, которые находятся между определенными заголовками в этом примере текстового файла.

    fileConn <- file("sample.txt")
    one <- "*Keyword"
    two <- "*Node"
    three <- "$ Node,X,Y,Z"
    four <- "1,639982.78040607,4733827.5104821,0"
    five <- "2,639757.59709573,4733830.43494066,0"
    six <- "3,639738.81268144,4733834.3619618,0"
    seven <- "*End"
    writeLines (c(one, two, three, four, five, six, seven), fileConn)
    close(fileConn)

    sample <- readLines("sample.txt")

Я хочу удалить все строки / строки между "*Node" и "*End". Поскольку я имею дело с файлами с разной длиной строк между этими заголовками, метод удаления должен основываться только на заголовках. Я понятия не имею, как это сделать, так как я только удалил строки в кадрах данных, на которые ссылаются номера строк ранее. Есть какие-нибудь подсказки?

Ожидаемый результат:

    *Keyword
    *Node
    *End

1 Ответ

0 голосов
/ 07 января 2019

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)])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...