Замените несколько строк в нескольких файлах на R

У меня есть что-то вроде 700 000 файлов в папке, где мне нужно найти и заменить несколько строк другими строками (все 4 кода символов). Неизвестно, присутствует ли строка в файле или нет. Я пытаюсь использовать gsub, но не могу найти, как это сделать с помощью регулярных выражений. Может ли кто-нибудь сказать мне хороший и эффективный способ справиться с этой задачей?

Это код, который я использовал до сих пор. Он хорошо работал только с одной инструкцией y <- gsub(...), но не работает для моей цели, очевидно, потому что только последняя инструкция gsub учитывается для определения переменной y...

chm_files <- list.files(getwd(), pattern=("^[[:digit:]]*.chm$"), full.names=F)

for(chm_file in chm_files) {
  x <- readLines(chm_file)
  y <- gsub("AG02|AG07|AG05|AG18|AG19|AG08|AG09|AG17", "AGRL", x)
  y <- gsub("SB28|SB42|SB43|SB33|SB41|SB34|SB39|SB35", "SWHT", x)
  y <- gsub("WB28|WB42|WB43|WB32|WB09|WB33|WB41|WB26", "BARL", x)
  y <- gsub("WW02|WW25|WW08|WW31|WW05|WW28|WW19|WW42", "WWHT", x)
  cat(y, file=chm_file, sep="\n")
}

person Marc    schedule 31.01.2015    source источник
comment
на какой ты платформе? почему бы не использовать скрипт оболочки? вам не нужно использовать r для всего   -  person rawr    schedule 31.01.2015
comment
Я использую win 8.1... Я почти ничего не знаю о сценариях оболочки. Эта задача — лишь крошечная часть кода, который я должен использовать для анализа своих данных, и я делаю все с помощью R. Может быть, сценарий оболочки можно интегрировать в мой код, я не знаю .. проверю, спасибо за идею. .   -  person Marc    schedule 31.01.2015
comment
Если вы всегда возвращаетесь к x, а не y, вы не потеряете более ранние исправления.   -  person IRTFM    schedule 31.01.2015
comment
Есть несколько бесплатных текстовых редакторов с возможностью пакетного редактирования файлов (под windows). Это, вероятно, чище, быстрее и проще, чем кодирование R   -  person Carl Witthoft    schedule 31.01.2015
comment
на самом деле я буду делать это много раз, и это часть других задач в R, поэтому я предпочитаю кодировать его раз и навсегда и позволять ему работать, чтобы получить результаты без какого-либо вмешательства.   -  person Marc    schedule 31.01.2015
comment
Я нашел расширение файла *.CHM в вашем образце кода R. CHM бывают скомпилированными и бинарными. Являются ли эти файлы действительно модулями помощи компилятора (CHM)?   -  person help-info.de    schedule 11.02.2015
comment
Нет, это файлы ASCII, содержащие параметры модели.   -  person Marc    schedule 13.02.2015
comment
Если вам когда-нибудь придется взглянуть на это снова, я бы также упростил работу с gsub(AG(02|05|07|08|09|17|18|19), AGRL, x) или gsub(AG(0 [257-9]|1[7-9]), AGRL, x) или gsub(AG(0[25]|[0-1][7-9]), AGRL, x) любая структура имеет смысл для контекст.   -  person ARobertson    schedule 25.02.2015
comment
Хороший вопрос, спасибо! это немного упростит мой код!   -  person Marc    schedule 26.02.2015


Ответы (2)


Я уверен, что в различных R-пакетах уже есть множество готовых функций для этой задачи, но в любом случае я просто приготовил эту для себя и других, чтобы использовать/модифицировать. Помимо запроса задач выше, он также распечатывает журнал отслеживания всех изменений, внесенных в файлы: .

Вот пример кода того, как он должен запускаться

# local directory with files you want to work with
setwd("C:/Users/DW/Desktop/New folder")
# get a list of files based on a pattern of interest e.g. .html, .txt, .php 
filer = list.files(pattern=".php")
# f - list of original string values you want to change
f <- c("localhost","dbtest","root","oldpassword")
# r - list of values to replace the above values with
# make sure the indexing of f & r
r <- c("newhost", "newdb", "newroot", "newpassword")

# Run the function and watch all your changes take place ;)
tracking_sheet <- multi_replace(filer, f, r)
tracking_sheet
person Matthew Bayly    schedule 12.08.2016

setwd("D:/R Training Material Kathmandu/File renaming procedures")
filer = list.files(pattern="2016")
f <- c("DATA,","$")
r <- c("","")
tracking_sheet <- multi_replace(filer, f, r)
tracking_sheet

Я использовал приведенный выше скрипт, но код не смог заменить знак $ во всех файлах.

person Adeel Hassan    schedule 05.07.2020