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?
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)
}
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'))
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.