【问题标题】:How to read the contents of an .sql file into an R script to run a query?如何将 .sql 文件的内容读入 R 脚本以运行查询?
【发布时间】:2017-06-30 19:07:01
【问题描述】:

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

在这种情况下,我没有得到任何回报。我可以尝试什么?

【问题讨论】:

  • 如果您手动执行dbSendQuery(conn, "SELECT Emp..."),那里是否返回任何行?您确定这是从文件读取部分的问题,而不是数据不存在的问题吗?
  • 是的,如果我这样做,则返回数据。我相信我只是不知道如何从.sql 文件中读取它。
  • 我已经在 SQL Server 和 Postgres 上测试了这个过程,没有任何问题(我没有可用的 mysql)。我也使用paste(readLines(...), collapse = " ") 取得了同样的成功。由于.sql 文件只是具有不同文件扩展名的文本文件,因此没有什么宇宙性的。这与您使用queryquery2 有关吗?你没有展示你是如何得到第二个变量的。
  • 我删除了 query2,因为它是一个错误,我将其更改为仅查询。您能建议一种使文件被读取为 UTF-8 的方法吗?我收到了一些非 UTF-8 符号。
  • 你试过readLines(..., encoding="UTF-8")吗?您可能还想查看iconv()

标签: sql r postgresql


【解决方案1】:

我自己在读取 sql 文件时遇到了麻烦,并且发现如果 sql 中有任何单行 cmets,则语法经常会被破坏。由于在 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)
}

【讨论】:

  • 谢谢。这个功能对我有用。我只想问一个小警告。有时我们需要指定我们用来读取文件的编码,例如:con = file(filepath, "r", encoding = "UTF-16LE")
  • 这太好了,谢谢。另一点,也许很明显(但让我绊倒了!):Regex 用 '/*...*/' 替换行 cmets '--' 将替换查询中所有出现的 '--',无论它是否前言评论与否。我有一个查询,其中包含多个“--”在引号内,不应更改,所以要小心这种事情。我(懒惰地)刚刚从函数中删除了这个正则表达式替换部分,然后确保在导入之前从文件中取出 SQL cmets。
  • 完美运行 - 我只是将 "line
  • 拥有不需要每次都定义的getSQL函数不是很有用吗?所以例如你只需要在一个新脚本中输入data &lt;- getSQL('path/data.sql')而不用上面的函数吗?
  • 我同意。一种选择是创建自己的自定义包,您可以像任何其他库一样加载它。对于我经常使用的任何小型实用程序功能,我都会这样做。
【解决方案2】:

我发现对于多行查询,readr 包中的read_file() 函数运行良好。您唯一需要注意的是避免使用单引号(双引号很好)。您甚至可以通过这种方式添加 cmets。

查询示例,另存为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'))

【讨论】:

  • 谢谢。这也适用于 postgres 查询吗?
  • 为函数“dbGetQuery”选择方法时的“语句”:错误:找不到函数“read_file”>
  • @kRazzyR 答案是 readr 包中的 read_file() 函数。您需要安装该软件包并使用 library(readr) 加载它才能使用它。
【解决方案3】:

您可以使用readr 包中的read_file() 函数。

fileName = read_file("C:/Users/me/Desktop/my_script.sql")

您将获得一个字符串变量fileName,其中包含所需的文本。

注意:使用/而不是\\\

【讨论】:

    【解决方案4】:

    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 计算机,您也可以尝试使用默认文本编辑器打开文件,然后选择

    文件 -> 另存为 ...

    编码:UTF-8

    以 .txt 文件扩展名保存。

    有趣的是,在 Microsoft SQL Server Management Studio 中更改文件会完全删除 BOM(字节顺序标记),而在文本编辑器中更改文件会将 BOM 转换为UTF-8 BOM,但仍会导致使用引用的答案正确读取查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2016-06-06
      • 2011-07-04
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多