一个R脚本,用于在SQL查询中查找旧数据库名称并将其替换为新数据库名称

时间:2017-10-27 19:20:12

标签: r replace gsub

最近对我使用的数据库名称进行了大修。我真的希望能够避免通过手动查找和替换手动修复我使用的所有查询。我想创建一个R脚本,它将sql文件作为输入,然后用其更新的/新名称替换数据库名称。

我知道我可以使用gsub替换部分字符串

x <- c("12345a", "23456a", "34567a", "45678a", "56789a")
gsub("a","b",x)
"12345b" "23456b" "34567b" "45678b" "56789b"

但是我并没有尝试用一个新条目替换字符串的单个部分,我觉得我不能简单地创建数据库名称的两个变量然后传递gsub文件。 gsub是正确的方向还是stringr有一些选择?

1 个答案:

答案 0 :(得分:1)

从技术上讲,你可以使用sedgrep之类的命令行工具在最少的键击中执行此操作,从技术上讲,可能有更好的工具来实际解析sql并确保你没有任何意想不到的影响,但如果您已经非常适应语言和环境,我完全理解您使用R的愿望。

我发现自己做了许多任务R(很容易忘记它只是一种统计计算语言)并不是因为它的灵活性和强大性足够99%的时间和切换语言需要大量的精神开销。

一种可行的方法:在进行任何测试之前,我一定要确保在某个地方有一个好的备份,并留意意外替换。

我还建议将所有列名放在带有“旧”和“新”列的.csv文件中,以便创建和编辑,更容易跟上并确保您的两个列表正确排列(喘息)如果您处理超过3-4个名称替换,则使用Excel。

示例.csv文件格式:

library(data.table)

## Generate example replacements csv file to see the format used
Replacements <- data.table(Old = c("Column_1a","Column_2a","Column_3a"),
                           New = c("Column_1b","Column_2b","Column_3b"))

fwrite(Replacements,"Replacements.csv",)

获得.csv之后,您可以创建一个函数来遍历文件夹中的文件列表,扩展名为“.sql”。

library(magrittr)
library(stringi)

## Read in list of replacements
Replacements <- fread("Replacements.csv")

## Use the folder with your queries as "path"
QueryList <- list.files(path = getwd(), pattern = "*.sql$")    

## Create a function to read, transform, and write a copy
sql_replacer <- function(FileName = NULL, oldNames = NULL, newNames = NULL) {
  FileName %>% 
    readLines() %>%
    stri_replace_all_regex(.,"\\b"%s+%oldNames%s+%"\\b",newNames,vectorize_all = FALSE) %>% 
    writeLines(., paste0("New_",FileName))
}

## Apply the "sql_replacer" function to all of your files
## with a list of old names and new ones
lapply(QueryList, sql_replacer, oldNames = Replacements$Old, newNames = Replacements$New)

这将读取文件“Example.sql”

SELECT
Column_1a,
Column_2a,
Column_3a
FROM ExampleDB.ExampleTable
WHERE Column_1a = 2;

并将副本另存为“New_Example.sql”。

SELECT
Column_1b,
Column_2b,
Column_3b
FROM ExampleDB.ExampleTable
WHERE Column_1b = 2;