web-dev-qa-db-ja.com

クエリを実行するために.sqlファイルの内容をRスクリプトに読み込む方法は?

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)

そして、この場合、何も返ってこません。何を試せますか?

14
user1367204

私は自分でsqlファイルの読み取りに問題があり、SQLに1行のコメントがあると、構文が壊れることが多いことがわかりました。 Rではsqlステートメントを1行の文字列として保存するため、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)
}
22
Matt Jewett

複数行のクエリの場合、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'))
22
Tim Abraham

readrパッケージのread_file()関数を使用できます。

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

目的のテキストを含む文字列変数fileNameを取得します。

注:/の代わりに\\\を使用します

5
TheNewGuy

Matt Jewettによる回答 は非常に便利ですが、その回答を使用してsqlサーバーによって生成された.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に変換されますが、それにもかかわらず、参照された回答を使用してクエリが適切に読み取られます。

2
Rookatu