2010-01-05 2 views
15

В R, как я могу импортировать содержимое многострочного текстового файла (содержащего SQL) в одну строку?Импорт многострочного SQL-запроса в одну строку

sql.txt файл выглядит следующим образом:

SELECT TOP 100 
setpoint, 
tph 
FROM rates 

Мне нужно импортировать текстовый файл в строку R таким образом, что она выглядит следующим образом:

> sqlString 
[1] "SELECT TOP 100 setpoint, tph FROM rates" 

Это так, что я могу подайте его на RODBC следующим образом:

Я пробовал команду readLines следующим образом, но это не gi ve строковый формат, который требуется RODBC.

> filecon<-file("sql.txt","r") 
> sqlString<-readLines(filecon, warn=FALSE) 
> sqlString 
[1] "SELECT TOP 100 "        "\t[Reclaim Setpoint Mean (tph)] as setpoint, " 
[3] "\t[Reclaim Rate Mean (tph)] as tphmean "  "FROM [Dampier_RC1P].[dbo].[Rates]"   
> 

ответ

17

Универсальная paste() команда может сделать это с аргументом collapse="":

lines <- readLines("/tmp/sql.txt") 
lines 
[1] "SELECT TOP 100 " " setpoint, "  " tph "   "FROM rates"  

sqlcmd <- paste(lines, collapse="") 
sqlcmd 
[1] "SELECT TOP 100 setpoint, tph FROM rates" 
+1

Спасибо Dirk - это работает, за исключением строки, которая выглядит так: «ВЫБЕРИТЕ ТОП 100 \ t уставки, \ t tph \ t FROM rates \ t». Просто нужно добавить gsub ("\ t", "", sqlcmd) –

+0

Ну, что я скопировал, не было вкладок, в любом случае анализатор SQL, вероятно, будет игнорировать вкладки, и вы нашли 'gsub()' - все хорошее , –

+6

Это, скорее всего, вызовет ваш запрос, если у вас есть комментарии '--', не так ли? Я бы использовал 'paste (readLines ('pathto/query.sql'), collapse =" \ n ")' –

1

попробовать paste(sqlString, collapse=" ")

4

Вот окончательный вариант того, что я использую. Спасибо Дирк.

fileconn<-file("sql.txt","r")   
sqlString<-readLines(fileconn)   
sqlString<-paste(sqlString,collapse="") 
gsub("\t","", sqlString) 
library(RODBC) 
sqlconn<-odbcConnect("RPM") 
results<-sqlQuery(sqlconn,sqlString) 
library(qcc) 
tph <- qcc(results$tphmean[1:50], type="xbar.one", ylim=c(4000,12000), std.dev=600) 
close(fileconn) 
close(sqlconn) 
0

Я использую sql <- gsub("\n","",sql) и sql <- gsub("\t","",sql) вместе.

8

Ниже приведена функция R, которая читает в многострочном SQL-запросе (из текстового файла) и преобразует его в однострочную строку. Функция удаляет форматирование и комментарии всей строки.

Чтобы использовать его, запустите код для определения функций, и ваша строка с одной строкой будет результатом запуска ONELINEQ ("querytextfile.sql", "~/path/to/thefile").

Как это работает: Встроенные комментарии подробно описывают это; он считывает каждую строку запроса и удаляет (заменяет ничем) все, что не требуется для выписывания однострочной версии запроса (как задано в вопросе). Результатом является список строк, некоторые из которых пустые и отфильтровываются; последний шаг - вставить этот список (список без списка) и вернуть одну строку.

#
# This set of functions allows us to read in formatted, commented SQL queries 
# Comments must be entire-line comments, not on same line as SQL code, and begun with "--" 
# The parsing function, to be applied to each line: 
LINECLEAN <- function(x) { 
    x = gsub("\t+", "", x, perl=TRUE); # remove all tabs 
    x = gsub("^\\s+", "", x, perl=TRUE); # remove leading whitespace 
    x = gsub("\\s+$", "", x, perl=TRUE); # remove trailing whitespace 
    x = gsub("[ ]+", " ", x, perl=TRUE); # collapse multiple spaces to a single space 
    x = gsub("^[--]+.*$", "", x, perl=TRUE); # destroy any comments 
    return(x) 
} 
# PRETTYQUERY is the filename of your formatted query in quotes, eg "myquery.sql" 
# DIRPATH is the path to that file, eg "~/Documents/queries" 
ONELINEQ <- function(PRETTYQUERY,DIRPATH) { 
    A <- readLines(paste0(DIRPATH,"/",PRETTYQUERY)) # read in the query to a list of lines 
    B <- lapply(A,LINECLEAN) # process each line 
    C <- Filter(function(x) x != "",B) # remove blank and/or comment lines 
    D <- paste(unlist(C),collapse=" ") # paste lines together into one-line string, spaces between. 
    return(D) 
} 
# TODO: add eof newline automatically to remove warning 
############################################################################################# 
+0

... Знаете, это, наверное, единственный лучший ответ на саморекламу, который я видел еще. Не могли бы вы добавить краткое объяснение того, как это работает на ваш ответ? (И под этим я имею в виду [отредактировать свой ответ] (http://stackoverflow.com/posts/30551944/edit)) –

2

Это то, что я использую:

# Set Filename 
fileName <- 'Input File.txt' 

doSub <- function(src, dest_var_name, src_pattern, dest_pattern) { 
    assign(
      x  = dest_var_name 
     , value = gsub(
          pattern  = src_pattern 
         , replacement = dest_pattern 
         , x = src 
        ) 
     , envir = .GlobalEnv 
    ) 
} 


# Read File Contents 
original_text <- readChar(fileName, file.info(fileName)$size) 

# Convert to UNIX line ending for ease of use 
doSub(src = original_text, dest_var_name = 'unix_text', src_pattern = '\r\n', dest_pattern = '\n') 

# Remove Block Comments 
doSub(src = unix_text, dest_var_name = 'wo_bc_text', src_pattern = '/\\*.*?\\*/', dest_pattern = '') 

# Remove Line Comments 
doSub(src = wo_bc_text, dest_var_name = 'wo_bc_lc_text', src_pattern = '--.*?\n', dest_pattern = '') 

# Remove Line Endings to get Flat Text 
doSub(src = wo_bc_lc_text, dest_var_name = 'flat_text', src_pattern = '\n', dest_pattern = ' ') 

# Remove Contiguous Spaces 
doSub(src = flat_text, dest_var_name = 'clean_flat_text', src_pattern = ' +', dest_pattern = ' ') 
1

Можно использовать readChar() вместо readLines(). У меня была постоянная проблема со смешанным комментарием (-- или /* */), и это всегда хорошо срабатывало для меня.

sql <- readChar(path.to.file, file.size(path.to.file)) 
query <- sqlQuery(con, sql, stringsAsFactors = TRUE) 

 Смежные вопросы

  • Нет связанных вопросов^_^