|
像包RMySQL,并sqldf允许一个与本地或远程数据库服务器连接。我创建一个便携式项目,该项目涉及的情况下导入SQL数据(或设备)不总是可以访问正在运行的服务器,但" {/ P/ v5 \0 r" d+ f' z. z
你 总是可以访问数据库的最新.SQL转储。; q" V0 }4 |) ]( t2 z% |& D
目标似乎很简单:在不涉及MySQL服务器的情况下将.sql转储导入R。% p3 M5 K+ G! C) P* o
更具体地说,我想创建一个列表列表,其中的元素与.sql转储中定义的任何数据库相对应(可能有多个),而这些元素又由这些数据库中的表组成。
% C5 [. x+ v, G为了重现这一点,让我们在此处获取样本sportsdb7 ?# N2 ]* x3 q: [6 ~
SQL文件-如果将其解压缩,则称为sportsdb_sample_mysql_20080303.sql。" h' ^: \2 P/ S! C& z
有人会认为sqldf可以做到这一点:
# q# Q4 r+ u% q8 Q$ Cread.csv.sql('sportsdb_sample_mysql_20080303.sql', sql="SELECT * FROM
& ~0 b6 E3 V4 B' z" Y( g# g* zaddresses") Error in sqliteSendQuery(con, statement, bind.data) : error in' C1 U4 |; R' w% Q6 E$ f: P
statement: no such table: addresses3 R* i' G9 K+ \( D& o8 k% f' N
即使在转储中肯定有一个表地址也是如此。sqldf列表上的该帖子提到了相同的错误,但没有解决方案。9 u: n! M. t+ q+ i
然后sql.reader,软件包中有一个函数ProjectTemplate,看起来很有希望。随便看看,该功能的源代码可以在这里找到,它假设一个正在运行的数据库服务器并依赖于RMySQL…而不是我所需要的。
) k/ z9 J$ ?4 N" \" K6 }: B$ _所以…我们似乎用光了所有的选项。蜂巢的任何帮助表示赞赏!& y) h0 V7 [+ z5 p' s" ?% y1 W. b
(再次重申,我 不是
; s0 n4 ~! \0 J8 l& T找依靠进入到SQL服务器的解决方案;与很容易dbReadTable从RMySQL,包我非常想绕过服务器,并从.SQL转储文件直接获取数据。)( n" S1 B% {* p3 E- |8 g) A7 ^, K
& ]' A% G" t/ m# y0 n1 O
解决方案:
0 j9 E6 n& Y. j8 g, _6 l0 w J9 `
: u# J K g0 |0 Y- _0 ^7 ]4 I. e$ U" E
1 M" g0 ?% F# m0 o4 M
根据要从表中提取的内容,这是如何处理数据的方法3 h' ]3 N2 f7 R
numLines 然后,您可以执行一些正则表达式来获取表名(在CREATE TABLE之后),列名(在第一括号之间)和VALUES(在CREATE# T' B) d5 b+ C7 \( f( y
TABLE之后和第二括号之间的行); N( E; @3 X$ Y) z: j
, P: z) f5 p% Y! P2 Y! s
编辑:响应OP的回答,如果我正确解释python脚本,它也将逐行读取它,过滤INSERT7 t, o$ w# p( ]
INTO行,解析为csv,然后写入文件。这与我最初的建议非常相似。我的版本在R中。如果文件太大,最好使用一些其他R包以大块形式读取文件
2 e- y9 e9 H5 p; J6 e* Koptions(stringsAsFactors=F)
, s+ R) B$ [( R8 `library(utils)
5 k, w+ ^: G2 C( C7 T8 tlibrary(stringi)/ |! g+ \4 J9 I$ H% `& X6 v& z
library(plyr)
5 J- R4 Q6 V! G( Y# F3 c' r8 Lmysqldumpfile <- "sportsdb_sample_mysql_20080303.sql", {8 N' d9 p% u7 F
allLines <- readLines(mysqldumpfile)
2 Z$ i; K0 y2 Y* D. ~+ linsertLines <- allLines[which(stri_detect_fixed(allLines, "INSERT INTO"))]
" ^( U8 M: w7 K4 n& X# \ `2 J" Wallwords <- data.frame(stri_extract_all_words(insertLines, " "))# Y. n' B% Z. N/ U
d_ply(allwords, .(X3), function(x) {# R6 o6 N* [. A% F" a f7 t. N
#x <- split(allwords, allwords$X3)[["baseball_offensive_stats"]]- w' I$ i' E. g# A r q" Z2 i
print(x[1,3])2 ?6 ^- A5 A- H- s) U$ X* Y z
#find where the header/data columns start and end
% H* S$ A$ A9 j. e( @- R valuesCol <- which(x[1,]=="VALUES")
" _5 E4 R* L( n" X1 I" [4 t lastCols <- which(apply(x, 2, function(y) all(is.na(y)))). _0 S3 ~# z# X3 U1 a
datLastCol <- head(c(lastCols, ncol(x)+1), 1) - 1( j3 z, K7 m. b6 ]) C: Z
#format and prepare for write to file4 G' t) M }3 z) b r
df <- data.frame(x[,(valuesCol+1):datLastCol])/ o5 ?5 F5 g+ p# X, m" u
df <- setNames(df, x[1,4valuesCol-1)])
/ D7 V3 q1 n; g0 K% S #type convert before writing to file otherwise its all strings
; \$ n6 G* ]% S. `" {7 j df[] <- apply(df, 2, type.convert)5 f5 Y: |0 ?/ q6 Z2 @" ]* ]
#write to file
# Z1 Q' R! }. h p% K write.csv(df, paste0(x[1,3],".csv"), row.names=F); D+ Z [1 {; e7 {; b ^, W8 X
}) |
|