歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【R】テキストファイルからSQLを文字列として読み込む

Rを使っていると、DBに接続してSQLを投げる作業がよく発生します。

すると、大抵は、RPostgreSQLなどのDBを扱うライブラリを用いてDBに接続し、 SQLの文字列を用意し、ライブラリの関数の引数に指定するというコードを書くことになります。

ただ、SQLの文字列を

sql <- """
SELECT
  user_id,
  SUM(pv)
FROM
  access_log
"""

みたいにRのコード内に置くと、どうしても不格好になっていまいます。

そこで、SQLを別のテキストファイルとして用意し、そのファイルから読み込む関数を書きました。

# パイプ演算子%>%を使えるライブラリをインポート
library(magrittr)

scan_query <- function(query_path) {
  return (
    scan(query_path, what='', quote='', sep='\n', comment.char = '', encoding='UTF-8') %>% 
      gsub(pattern='--.*$', replacement='') %>% # 正規表現でコメントアウトを消す
      paste0(collapse=' ')
  )
}

# ファイルパスからSQLを読み込めるようになる
sql <- scan_query('./example.sql')

Rのテキストファイルの読み込みはちょっと特殊で、scan関数で読み込みます。 改行文字に\nを指定することで、テキストの文字列のベクトルに変換されます。 その後にSQLコメントアウトを消して結合する、というコードです。

もしかすると、既に文字列をいい感じに読み込む関数(かライブラリ)も用意されているのかもしれません。