Я хотел бы удалить все строки из файла, которые начинаются с определенного шаблона.Я хотел бы сделать это с R. Хорошей практикой является не сначала читать весь файл, а затем удалять все соответствующие строки, а затем записывать весь файл, так как файл может быть огромным.Таким образом, мне интересно, могу ли я иметь соединение для чтения и записи (открытое все время, по одному за раз?) К файлу того же .Следующее показывает идею (но «зависает» и, следовательно, терпит неудачу).
## Create an example file
fnm <- "foo.txt" # file name
sink(fnm)
cat("Hello\n## ----\nworld\n")
sink()
## Read the file 'fnm' one line at a time and write it back to 'fnm'
## if it does *not* contain the pattern 'pat'
pat <- "## ----" # pattern
while(TRUE) {
rcon <- file(fnm, "r") # read connection
line <- readLines(rcon, n = 1) # read one line
close(rcon)
if(length(line) == 0) { # end of file
break
} else {
if(!grepl(pat, line)) {
wcon <- file(fnm, "w")
writeLines(line, con = wcon)
close(wcon)
}
}
}
Примечание:
1) См. здесь для ответа, если кто-то пишет в новый файл.Затем можно удалить старый файл и переименовать новый в старый, но это выглядит не очень элегантно :-).
2) Обновление : следующее MWE производит
Hello
world
-
world
См .:
## Create an example file
fnm <- "foo.txt" # file name
sink(fnm)
cat("Hello\n## ----\nworld\n")
sink()
## Read the file 'fnm' one line at a time and write it back to 'fnm'
## if it does *not* contain the pattern 'pat'
pat <- "## ----" # pattern
con <- file(fnm, "r+") # read and write connection
while(TRUE) {
line <- readLines(con, n = 1L) # read one line
if(length(line) == 0) break # end of file
if(!grepl(pat, line))
writeLines(line, con = con)
}
close(con)