如何将.sql文件的内容读入R脚本以运行查询?

时间:2017-06-30 19:07:02

标签: sql r postgresql

我尝试了readLinesread.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)

在这种情况下,我没有得到任何回报。我该怎么办?

4 个答案:

答案 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

注意:使用/代替\\\