|
像包RMySQL,并sqldf允许一个与本地或远程数据库服务器连接。我创建一个便携式项目,该项目涉及的情况下导入SQL数据(或设备)不总是可以访问正在运行的服务器,但
) G3 M" Q( B. q; t你 总是可以访问数据库的最新.SQL转储。+ r! v Q9 J: W* Y
目标似乎很简单:在不涉及MySQL服务器的情况下将.sql转储导入R。
: ^, [# u8 \6 \% j9 s3 s更具体地说,我想创建一个列表列表,其中的元素与.sql转储中定义的任何数据库相对应(可能有多个),而这些元素又由这些数据库中的表组成。. q1 j9 J* W8 V
为了重现这一点,让我们在此处获取样本sportsdb4 L' Y9 I' Y/ n7 R- v( C
SQL文件-如果将其解压缩,则称为sportsdb_sample_mysql_20080303.sql。9 T- C: [/ p" K7 J# O
有人会认为sqldf可以做到这一点:
8 G- V5 `; @) T; X1 X& D5 M# |read.csv.sql('sportsdb_sample_mysql_20080303.sql', sql="SELECT * FROM& z0 Q% l3 Q6 ^& T$ r2 `
addresses") Error in sqliteSendQuery(con, statement, bind.data) : error in
' ^; x# n8 X2 @/ P+ vstatement: no such table: addresses
$ Z9 a. h) C- _9 d, ]3 \1 H9 \8 T' t6 t即使在转储中肯定有一个表地址也是如此。sqldf列表上的该帖子提到了相同的错误,但没有解决方案。# x- O* Y- k/ x7 x# O+ F% p
然后sql.reader,软件包中有一个函数ProjectTemplate,看起来很有希望。随便看看,该功能的源代码可以在这里找到,它假设一个正在运行的数据库服务器并依赖于RMySQL…而不是我所需要的。+ D( F; j2 o! q/ D1 w
所以…我们似乎用光了所有的选项。蜂巢的任何帮助表示赞赏!
: j! r# T: g! b. |6 p, O) R(再次重申,我 不是/ F: D( {! S3 L+ |9 ]# l
找依靠进入到SQL服务器的解决方案;与很容易dbReadTable从RMySQL,包我非常想绕过服务器,并从.SQL转储文件直接获取数据。)6 s+ j- @6 A2 O) _3 b& q( l
6 Z% g3 J0 v4 V1 B
解决方案:1 f3 ~6 U4 p; x# v$ s
6 b6 m+ d* {# l2 K& M
" ?* U6 s6 y; {. R" m* B
0 [! a5 y7 ^8 g( d$ o2 B! K 根据要从表中提取的内容,这是如何处理数据的方法
# i, q* j ]% R9 S& QnumLines 然后,您可以执行一些正则表达式来获取表名(在CREATE TABLE之后),列名(在第一括号之间)和VALUES(在CREATE% G5 [- A- j. s
TABLE之后和第二括号之间的行)
( T" H! J5 A9 P( N) q" F/ ]4 f7 ?3 F" s( C1 c5 x \
编辑:响应OP的回答,如果我正确解释python脚本,它也将逐行读取它,过滤INSERT# F. W4 ~. K6 S' M ~+ Y, q4 K
INTO行,解析为csv,然后写入文件。这与我最初的建议非常相似。我的版本在R中。如果文件太大,最好使用一些其他R包以大块形式读取文件 Q$ i) o6 r0 R e; A
options(stringsAsFactors=F)
# B+ x/ g d$ ylibrary(utils)- l7 w! M- F. J2 L/ `
library(stringi)
9 E. @3 O. Z/ g# ^3 N: ^& plibrary(plyr)
" x8 J# j1 ~7 z: d$ a# }- B. Lmysqldumpfile <- "sportsdb_sample_mysql_20080303.sql"
# S- ^3 W4 |& |; W3 P' G1 G6 f& EallLines <- readLines(mysqldumpfile)
, R# y: t; a R, K( e; q9 K$ uinsertLines <- allLines[which(stri_detect_fixed(allLines, "INSERT INTO"))] f( ]- H$ Q3 @2 I
allwords <- data.frame(stri_extract_all_words(insertLines, " "))
+ A! F# {8 X0 l4 od_ply(allwords, .(X3), function(x) {2 W6 D. B; b3 c, S/ u( v
#x <- split(allwords, allwords$X3)[["baseball_offensive_stats"]]8 t! X5 w# N6 F
print(x[1,3])
6 v6 X+ ?8 I0 E' M- E) k #find where the header/data columns start and end
5 X9 o( X$ b% s1 f$ F valuesCol <- which(x[1,]=="VALUES")
6 e+ P2 t$ n4 L6 _6 ]' ^( }) X1 W3 O lastCols <- which(apply(x, 2, function(y) all(is.na(y))))9 D! P$ @7 f3 @+ P9 s
datLastCol <- head(c(lastCols, ncol(x)+1), 1) - 1, R! j* G7 d( X1 z2 ]% G
#format and prepare for write to file
+ ?6 n& p% f) R3 d5 A/ B+ f( ` df <- data.frame(x[,(valuesCol+1):datLastCol])2 g) M; s, v& ^$ ~+ ?
df <- setNames(df, x[1,4 valuesCol-1)])
8 V* [. Z3 g6 {# K+ E* b3 B #type convert before writing to file otherwise its all strings. ^" F4 v# T% E: U* b! e, N ~# Z
df[] <- apply(df, 2, type.convert)$ p' c F/ |: N* D
#write to file! |4 g9 W' n1 b& h* q( ?1 m; f( o
write.csv(df, paste0(x[1,3],".csv"), row.names=F)* q1 }. s0 Z: l- L5 j
}) |
|