我尝试了readLines
和read.csv
功能,但之后无效。
以下是my_script.sql
文件的内容:
SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE HireDate >= '1-july-1993'
并将其保存在我的桌面上。
现在我想从我的R脚本运行此查询。这就是我所拥有的:
conn = connectDb()
fileName <- "C:\\Users\\me\\Desktop\\my_script.sql"
query <- readChar(fileName, file.info(fileName)$size)
query <- gsub("\r", " ", query)
query <- gsub("\n", " ", query)
query <- gsub("", " ", query)
recordSet <- dbSendQuery(conn, query)
rate <- fetch(recordSet, n = -1)
print(rate)
disconnectDb(conn)
在这种情况下,我没有得到任何回报。我该怎么办?
答案 0 :(得分:18)
我自己读取sql文件时遇到了麻烦,并且发现如果sql中有任何单行注释,语法常常会被破坏。因为在R中你将sql语句存储为单行字符串,如果sql中有任何双短划线,它将在双击之后注释掉任何代码。
这是我在读取要在R中使用的.sql文件时通常使用的函数。
getSQL <- function(filepath){
con = file(filepath, "r")
sql.string <- ""
while (TRUE){
line <- readLines(con, n = 1)
if ( length(line) == 0 ){
break
}
line <- gsub("\\t", " ", line)
if(grepl("--",line) == TRUE){
line <- paste(sub("--","/*",line),"*/")
}
sql.string <- paste(sql.string, line)
}
close(con)
return(sql.string)
}
答案 1 :(得分:18)
我发现对于多行的查询,readr包中的read_file()
函数运行良好。你唯一需要注意的是避免单引号(双引号都没问题)。您甚至可以通过这种方式添加评论。
示例查询,保存为query.sql
SELECT
COUNT(1) as "my_count"
-- comment goes here
FROM -- tabs work too
my_table
然后我可以使用
将结果存储在数据框中df <- dbGetQuery(con, statement = read_file('query.sql'))
答案 2 :(得分:2)
answer by Matt Jewett非常有用,但是我想补充一点,当我尝试使用该答案读取由sql server生成的.sql文件时,有时会遇到以下警告:
警告消息:在readLines(con,n = 1)中:第1行似乎包含 嵌入式nul
在这种情况下,readLines
返回的第一行通常为“ ÿþ”(即UTF-16字节顺序标记),而后续的行则无法正确读取。我通过在 Microsoft SQL Server Management Studio 中打开sql文件并选择
文件->另存为...
然后在保存按钮旁边的小箭头上选择
保存编码...
并选择
Unicode(无签名的UTF-8)-代码页65001
从“编码”下拉菜单中。
如果您没有 Microsoft SQL Server Management Studio ,并且正在使用Windows计算机,则还可以尝试使用默认的文本编辑器打开文件,然后选择< / p>
文件->另存为...
编码:UTF-8
以.txt文件扩展名保存。
有趣的是,在 Microsoft SQL Server Management Studio 中更改文件会完全删除BOM(字节顺序标记),而在文本编辑器中更改文件会将BOM转换为UTF-8 BOM,但是仍然导致使用引用的答案正确读取查询。
答案 3 :(得分:2)
您可以使用read_file()
软件包中的readr
函数。
fileName = read_file("C:/Users/me/Desktop/my_script.sql")
您将获得带有所需文本的字符串变量fileName
。
注意:使用/
代替\\\