回答

收藏

将MySQL转储导入R(不需要MySQL服务器)

技术问答 技术问答 224 人阅读 | 0 人回复 | 2023-09-13

像包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 <- &quot;sportsdb_sample_mysql_20080303.sql&quot;
# 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, &quot;INSERT INTO&quot;))]  f( ]- H$ Q3 @2 I
allwords <- data.frame(stri_extract_all_words(insertLines, &quot; &quot;))
+ 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)[[&quot;baseball_offensive_stats&quot;]]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,]==&quot;VALUES&quot;)
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,4valuesCol-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],&quot;.csv&quot;), row.names=F)* q1 }. s0 Z: l- L5 j
})
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则