web-dev-qa-db-fra.com

Comment lire le contenu d'un fichier .sql dans un script R pour exécuter une requête?

J'ai essayé les fonctions readLines et read.csv mais ensuite je ne travaille pas.

Voici le contenu du fichier my_script.sql:

SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE HireDate >= '1-july-1993'

et il est enregistré sur mon bureau.

Maintenant, je veux exécuter cette requête à partir de mon script R. Voici ce que j'ai

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)

Et je ne reçois rien dans ce cas. Que puis-je essayer?

11
user1367204

J'ai moi-même eu du mal à lire les fichiers SQL, et j'ai constaté que la syntaxe est souvent brisée s'il y a des commentaires d'une seule ligne dans le SQL. Étant donné que dans R vous stockez l'instruction SQL sous forme de chaîne simple, s'il y a des doubles tirets dans SQL, il commentera essentiellement tout code après le double tiret.

C’est une fonction que j’utilise généralement chaque fois que je lis dans un fichier .sql à utiliser dans R.

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)
}
14
Matt Jewett

J'ai trouvé que pour les requêtes comportant plusieurs lignes, la fonction read_file() du paquet readr fonctionnait bien. La seule chose à laquelle vous devez prêter attention est d'éviter les guillemets simples (les guillemets doubles conviennent). Vous pouvez même ajouter des commentaires de cette façon.

Exemple de requête, enregistrée en tant que query.sql

SELECT 
COUNT(1) as "my_count"
-- comment goes here
FROM -- tabs work too
  my_table

Je peux ensuite stocker les résultats dans un bloc de données avec

df <- dbGetQuery(con, statement = read_file('query.sql'))
12
Tim Abraham

La réponse de Matt Jewett est très utile, mais je voudrais ajouter que je rencontre parfois l'avertissement suivant lors de la tentative de lecture de fichiers .sql générés par le serveur SQL à l'aide de cette réponse:

Message d'avertissement: Dans readLines (con, n = 1): la ligne 1 semble contenir un nul intégré

La première ligne renvoyée par readLines est souvent "" dans ces cas (c'est-à-dire la marque d'ordre d'octet UTF-16) et les lignes suivantes ne sont pas lues correctement. J'ai résolu ce problème en ouvrant le fichier SQL dans Microsoft SQL Server Management Studio et en sélectionnant 

Fichier -> Enregistrer sous ... 

puis sur le petit downarrow à côté du bouton de sauvegarde sélectionnant 

Enregistrer avec encodage ...

et en choisissant 

Unicode (UTF-8 sans signature) - Codepage 65001

dans le menu déroulant Codage.

Si vous n'avez pas Microsoft SQL Server Management Studio et utilisez un ordinateur Windows, vous pouvez également essayer d'ouvrir le fichier avec l'éditeur de texte par défaut, puis de sélectionner 

Fichier -> Enregistrer sous ...

Encodage: UTF-8 

enregistrer avec une extension de fichier .txt.

Changer le fichier de manière intéressante dans Microsoft SQL Server Management Studio supprime complètement la nomenclature (byte order mark), alors que changer le fichier dans l'éditeur de texte convertit la nomenclature en nomenclature UTF-8 la requête doit être correctement lue à l'aide de la réponse référencée.

0
Rookatu