2014-04-20 46 views
0

我是R的新手,與R studio一起工作,並且很享受它。 我基本上試圖分割一個SQL語句來替換所有的別名與完整的表名。我已經對這個論壇有以下字符串的多重替換

下面的代碼的代碼大量幫助,需要和SQL語句將其分解成它的基本組件,以便 選擇 FROM WHERE

我使用的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]) 
} 
+0

所以,你要採取一切'TABLE_1爲AL1'何'AL1.x'是'Table_1'.x'(但在一個通用的方式)更換呢? – hrbrmstr

回答

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 
+0

這兩個答案都非常好,但我選擇了這一個,因爲它將是我將使用的一個。 @ hrbrmstr的其他答案可能會更完整,但我必須深入研究正則表達式,才能完全理解它(下週的任務),謝謝你們的幫助,這真的非常有用 –

1
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"