2010-01-05 31 views
15

Trong R, làm cách nào tôi có thể nhập nội dung của tệp văn bản nhiều dòng (có chứa SQL) vào một chuỗi?Nhập truy vấn SQL nhiều dòng vào một chuỗi

File sql.txt trông như thế này:

SELECT TOP 100 
setpoint, 
tph 
FROM rates 

Tôi cần phải nhập khẩu mà tập tin văn bản vào một chuỗi R như vậy mà nó trông như thế này:

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

Đó là vì vậy mà tôi có thể cấp nó cho RODBC như thế này

> library(RODBC) 
> myconn<-odbcConnect("RPM") 
> results<-sqlQuery(myconn,sqlString) 

Tôi đã thử lệnh readLines như sau nhưng nó không gi đã định dạng chuỗi mà RODBC cần.

> 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]"   
> 

Trả lời

17

đa năng paste() lệnh có thể làm điều đó với lập luận 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

Cảm ơn Dirk - hoạt động, ngoại trừ chuỗi có dạng này "CHỌN TOP 100 \ t điểm đặt, \ t t \ \ T TỪ giá \ t". Chỉ cần thêm gsub ("\ t", "", sqlcmd) –

+0

Những gì tôi đã sao chép không có tab, trong mọi trường hợp, trình phân tích cú pháp SQL có thể sẽ bỏ qua các tab và bạn tìm thấy 'gsub()' - tất cả đều tốt . –

+6

Điều này có thể sẽ bán thịt truy vấn của bạn nếu bạn có bất kỳ nhận xét '--' nào, phải không? Tôi muốn sử dụng 'paste (readLines ('pathto/query.sql'), collapse =" \ n ")' –

1

thử paste(sqlString, collapse=" ")

4

Dưới đây là phiên bản cuối cùng của những gì tôi đang sử dụng. Cảm ơn Dirk.

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

Tôi sử dụng sql <- gsub("\n","",sql)sql <- gsub("\t","",sql) cùng nhau.

8

Dưới đây là hàm R đọc trong truy vấn SQL nhiều dòng (từ tệp văn bản) và chuyển đổi nó thành chuỗi đơn. Hàm này xóa các định dạng và nhận xét toàn bộ dòng.

Để sử dụng, hãy chạy mã để xác định các hàm và chuỗi một dòng của bạn sẽ là kết quả của việc chạy ONELINEQ ("querytextfile.sql", "~/path/to/thefile").

Cách hoạt động: Nhận xét nội dòng chi tiết việc này; nó đọc mỗi dòng của truy vấn và xóa (thay thế bằng không có gì) bất cứ điều gì là không cần thiết để viết ra một phiên bản dòng đơn của truy vấn (như được hỏi trong câu hỏi). Kết quả là một danh sách các dòng, một số dòng trống và được lọc ra; bước cuối cùng là dán danh sách này (không công khai) lại và trả về một dòng.

#
# 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

... Bạn biết đấy, đây có lẽ là câu trả lời tự quảng cáo tốt nhất mà tôi từng thấy. Bạn có thể thêm giải thích ngắn gọn về cách nó hoạt động với câu trả lời của bạn không? (Và theo đó, ý tôi là [sửa câu trả lời của bạn] (http://stackoverflow.com/posts/30551944/edit)) –

2

Đây là những gì tôi sử dụng:

# 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

Có thể sử dụng readChar() thay vì readLines(). Tôi đã gặp sự cố liên tục với nhận xét hỗn hợp (-- hoặc /* */) và điều này luôn hoạt động tốt đối với tôi.

sql <- readChar(path.to.file, file.size(path.to.file)) 
query <- sqlQuery(con, sql, stringsAsFactors = TRUE) 
Các vấn đề liên quan