【问题标题】:Multiple replacements to a string多个替换字符串
【发布时间】:2014-04-20 11:48:28
【问题描述】:

我是 R 新手,在 R 工作室工作,我很享受。 我基本上是在尝试分割一条 SQL 语句以用完整的表名替换所有别名。我已经通过下面的代码在这个论坛上得到了大量帮助

以下代码、获取和 SQL 语句并将其拆分为基本组件,因此 选择 从 在哪里

我以 SQL 为例,但该语句可以有任意数量的表和更多的别名。目的是编写一个循环,该循环将用完整的表名替换别名,而与 SQL 和别名数量无关。目前我的 gsub 函数只会替换我查询中的第二个别名。我想知道是否有人能看出我的逻辑错误?

txt <- "SELECT AL1.attr1,AL2.attr2 FROM Table_1 as AL1, Table_2 as AL2 WHERE AL1.attr1 == 1"

###########################################################################################
# First Split the SQL statement into SELECT FROM and WHERE clause (1 Row FOr each)
# Take The From Clause and Split that on Period so AL1.Attrib1 = AL1  Attrib1
# Then split on 'as' so splitting the alias from the actual table name
###########################################################################################

Reference:

SQLSplit = sapply(strsplit(txt,split="WHERE|FROM|SELECT"),trim)
SQLSegmented = unlist(strsplit(SQLSplit, ".|,", fixed = TRUE))
SplitOnPeriod = sapply(strsplit(SQLSegmented[2],split=","),trim)
SplitOnComma = sapply(strsplit(SplitOnPeriod,split="as"),trim)

for (i in 1:ncol(SplitOnComma)) 
{
    cat(SplitOnComma[1,i])
    cat(SplitOnComma[2,i])
    test = gsub(SplitOnComma[2,i], SplitOnComma[1,i], SQLSegmented[1])
}

【问题讨论】:

  • 那么,你想把所有Table_1 as AL1AL1.x 替换为Table_1.x` 的地方(但以通用方式)?

标签: r loops gsub


【解决方案1】:

这可能只是您如何 [不] 通过 for 循环存储每次迭代的结果的问题。如果您反复更新同一个字符串(下面称为 test),最终得到一个完全更新的字符串怎么办?

test <- SQLSegmented[1]
for (i in 1:ncol(SplitOnComma)) 
{
  cat(SplitOnComma[1,i])
  cat(SplitOnComma[2,i])
  test = gsub(SplitOnComma[2,i], SplitOnComma[1,i], test)
}
test

【讨论】:

  • 两个答案都很好,但我选择了这个,因为它将是我将使用的那个。 @hrbrmstr 的另一个答案可能更完整,但我必须深入研究正则表达式才能完全理解它(下周的任务),谢谢你们的帮助,它真的非常有用
【解决方案2】:
library(stringr)

txt <- "SELECT AL1.attr1,AL2.attr2 FROM Table_1 as AL1, Table_2 as AL2 WHERE AL1.attr1 == 1"

matches <- str_match_all(txt, "([A-Za-z0-9_]+)\ +as\ +([A-Za-z0-9_]+)")

for (i in 1:nrow(matches[[1]])) {

  txt <- gsub(sprintf("%s.", matches[[1]][i,3]), 
              sprintf("%s.", matches[[1]][i,2]),
              txt,
              fixed=TRUE)

}

txt <- gsub("\ +as\ +[A-Za-z_0-9]+", "", txt)
txt
## [1] "SELECT Table_1.attr1,Table_2.attr2 FROM Table_1, Table_2 WHERE Table_1.attr1 == 1"

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2020-08-31
    • 2022-01-08
    • 1970-01-01
    • 2017-12-06
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多