2010-01-05 6 views
15

Wie kann ich in R den Inhalt einer mehrzeiligen Textdatei (die SQL enthält) in eine einzelne Zeichenfolge importieren?Import mehrzeiliger SQL-Abfrage in einzelne Zeichenfolge

Die sql.txt Datei sieht wie folgt aus:

SELECT TOP 100 
setpoint, 
tph 
FROM rates 

Ich brauche diese Textdatei in eine R-String zu importieren, so dass es wie folgt aussieht:

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

Das ist, so dass ich ihn an die RODBC wie diese

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

ich die Readlines versucht habe Befehl wie folgt aber es funktioniert nicht gi Das String-Format, das RODBC benötigt.

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

Antwort

17

Der vielseitige paste() Befehl kann mit dem Argument tun, dass 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

Danke Dirk - das funktioniert, außer der String sieht so aus "SELECT TOP 100 \ t Sollwert, \ t tph \ t FROM Raten \ t". Nur benötigt, um gsub hinzuzufügen ("\ t", "", sqlcmd) –

+0

Nun, was ich kopiert hatte keine Tabs, auf jeden Fall wird der SQL-Parser wahrscheinlich die Tabs sowieso ignorieren und Sie fanden die 'gsub()' - alle gut . –

+6

Dies wird wahrscheinlich Ihre Frage Metzger, wenn Sie irgendwelche "-" Kommentare haben, nicht wahr? Ich würde 'paste (readLines ('pathto/query.sql'), collapse =" \ n ") verwenden.' –

1

versuchen paste(sqlString, collapse=" ")

4

Hier ist die letzte Version von dem, was ich verwende. Danke 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

Ich benutze sql <- gsub("\n","",sql) und sql <- gsub("\t","",sql) zusammen.

8

Unten ist eine R-Funktion, die eine mehrzeilige SQL-Abfrage (aus einer Textdatei) einliest und in eine einzeilige Zeichenfolge konvertiert. Die Funktion entfernt Formatierungen und ganze Zeilenkommentare.

Um es zu verwenden, führen Sie den Code, um die Funktionen zu definieren, und Ihre einzeilige Zeichenfolge wird das Ergebnis der Ausführung ONELINEQ ("querytextfile.sql", "~/Pfad/zu/thefile").

Wie es funktioniert: Inline-Kommentare Details hierzu; Es liest jede Zeile der Abfrage und löscht (ersetzt durch nichts), was nicht benötigt wird, um eine einzeilige Version der Abfrage (wie in der Frage gefragt) zu schreiben. Das Ergebnis ist eine Liste von Zeilen, von denen einige leer sind und herausgefiltert werden; Der letzte Schritt besteht darin, diese (nicht aufgelistete) Liste zusammenzufügen und die einzelne Zeile zurückzugeben.

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

... Weißt du, das ist wahrscheinlich die einzige beste Antwort auf die Eigenwerbung, die ich bisher gesehen habe. Könnten Sie eine kurze Erklärung hinzufügen, wie es auch zu Ihrer Antwort funktioniert? (Und damit meine ich, [bearbeite deine Antwort] (http://stackoverflow.com/posts/30551944/edit)) –

2

Dies ist, was ich benutze:

# 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

es möglich ist, readChar() statt readLines() zu verwenden. Ich hatte ein laufendes Problem mit gemischten kommentieren (-- oder /* */) und das hat immer gut für mich gearbeitet.