Проблемы с заменой подстроки - PullRequest
0 голосов
/ 26 мая 2019

Пусть строка s будет

structure(",SELECTCOLUMNS(FILTER(CG_PART,((CG_PART[0NIVEL4] = \"4.03.01.003\"))  && CG_PART[isEstorno] = 0 ) ,\"Data\",CG_PART[DATA], \"D/C\", CG_PART[D_C],\"Nivel1\", \"(-) Custo de serviços\", \"Nivel2\", \"Custo de Frete de Serviços PJ\",\"Nivel3\", [0NIVEL4],\"Valor\", IF(CG_PART[D_C] = \"D\",-CG_PART[VALORR],CG_PART[VALORR]), \"Ordem Apresentacao\", 7, \"isSub\", 0)")

Я хотел бы заменить содержимое:

\"Nivel1\", \"(-) Custo de serviços\", \"Nivel2\", \"Custo de Frete de
Serviços PJ\",\"Nivel3\", [0NIVEL4],\"Valor\"

к этому:

\"Nivel1\", \"(=) RECEITA OPERACIONAL LÍQUIDA\",\"Nivel2\", \"(=) RECEITA OPERACIONAL 
LÍQUIDA\", \"Nivel3\",\"(=) RECEITA OPERACIONAL LÍQUIDA\",\"Valor\"

поэтому я использовал этот код

init.pos <- str_start(s, "\"Nivel1\"",ignore.case = F)
end.pos <- str_end(s, ",\"Valor\"",ignore.case = F)  

substr(s, init.pos, end.pos) <- "\"Nivel1\",  \"(=) RECEITA OPERACIONAL LÍQUIDA\",\"Nivel2\", \"(=) RECEITA OPERACIONAL LÍQUIDA\", \"Nivel3\",\"(=) RECEITA OPERACIONAL LÍQUIDA\", \"Valor\""

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

Затем добавил в мой код эту логику:

middle.pos <- (init.pos+end.pos)/2
substr(s, middle.pos, end.pos) <- "\"Nivel3\",\"(=) RECEITA OPERACIONAL LÍQUIDA\", \"Valor\""
substr(s, init.pos, middle.pos-1) <- "\"Nivel1\",  \"(=) RECEITA OPERACIONAL LÍQUIDA\",\"Nivel2\", \"(=) RECEITA OPERACIONAL LÍQUIDA\","

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


OBS: причина, по которой я использовал эту логику, заключается в том, что я запусту свой код, чтобы заменить контент между «Nivel1» и «Valor» новым контентом, но строки между ними различаются.

1 Ответ

1 голос
/ 27 мая 2019

Вы можете использовать gsub для замены содержимого между "Nivel1" и "Valor" новым содержимым.

tt <- "\"(=) RECEITA OPERACIONAL LÍQUIDA\",\"Nivel2\", \"(=) RECEITA OPERACIONAL LÍQUIDA\", \"Nivel3\",\"(=) RECEITA OPERACIONAL LÍQUIDA\","

gsub("(.*\"Nivel1\").*(\"Valor\".*)", paste("\\1", tt, "\\2"), s, ignore.case = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...