之前我问过类似的问题,但我仍然需要一些帮助/指出正确的方向。
我试图找到一个列中的某些单词,这些单词包含所有行上的SQL语句,并提取R studio中的下一个单词。
示例:让我们调用此数据框" SQL
| **UserID** | **SQL Statement**
1 | N781 | "SELECT A, B FROM Table.1 p JOIN Table.2 pv ON
p.ProdID.1ProdID.1 JOIN Table.3 v ON pv.BusID.1 =
v.BusID WHERE SubID = 1 ORDER BY v.Name;"
2 | N283 | "SELECT D, E FROM Table.11 p JOIN Table.2 pv ON
p.ProdID.1ProdID.1 JOIN Table.3 v ON pv.BusID.1 =
v.BusID WHERE SubID = 1 ORDER BY v.Name;"
所以我试图取出表名。所以我试图找到" From"和#34;加入"并拉下一个表名。
我在前面的帮助下使用了一些代码:
我制作专栏" SQL语句"在2个名称" b"
的列表中我使用代码:
z <- mapply(grepl,"(FROM|JOIN)",b)
为每个列表中的每个单词提供了一个True和fasle。
z <- mapply(grep,"(FROM|JOIN)",b)
以上情况很接近。它给了我每个列表中每场比赛的位置。
但我只是想找到“加入”或“来自”一词并取出文字。我试图获得类似
的输出 | **UserID** | **SQL Statement** | Tables
1 | N781 | "SELECT A, B FROM Table.1 p JOIN Table.2 pv ON | Table.1, Table.2
p.ProdID.1ProdID.1 JOIN Table.3 v ON pv.BusID.1 =
v.BusID WHERE SubID = 1 ORDER BY v.Name;"
2 | N283 | "SELECT D, E FROM Table.11 p JOIN Table.2 pv ON
p.ProdID.1ProdID.1 JOIN Table.3 v ON pv.BusID.1 = | Table.11, Table.31
v.BusID WHERE SubID = 1 ORDER BY v.Name;"
答案 0 :(得分:0)
这是一个使用基本R选项的工作脚本。这里的灵感是利用strsplit
在关键字FROM
或JOIN
上拆分查询字符串。然后,每个结果术语的第一个单独的单词(第一个术语除外)应该是表名。
sql <- "SELECT A, B FROM Table.1 p JOIN Table.2 pv ON
p.ProdID.1ProdID.1 JOIN Table.3 v ON pv.BusID.1 =
v.BusID WHERE SubID = 1 ORDER BY v.Name;"
terms <- strsplit(sql, "(FROM|JOIN)\\s+")
out <- unlist(lapply(terms, function(x) gsub("^([^[:space:]]+).*", "\\1", x)))
out <- out[2:length(out)]
out
[1] "Table.1" "Table.2" "Table.3"
为了更好地理解我的所作所为,请按照演示进行操作,看看分割后产生的terms
列表。
修改强>
以下是另一个演示的链接,该演示展示了如何在查询字符串向量上使用上述逻辑,为每个查询生成表向量列表