像包RMySQL
,并sqldf
允许一个与本地或远程数据库服务器连接。我创建一个便携式项目,该项目涉及的情况下导入SQL数据(或设备)不总是可以访问正在运行的服务器,但
你 总是可以访问数据库的最新.SQL转储。
目标似乎很简单:在不涉及MySQL服务器的情况下将.sql转储导入R。
更具体地说,我想创建一个列表列表,其中的元素与.sql转储中定义的任何数据库相对应(可能有多个),而这些元素又由这些数据库中的表组成。
为了重现这一点,让我们在此处获取样本sportsdb
SQL文件-如果将其解压缩,则称为sportsdb_sample_mysql_20080303.sql。
有人会认为sqldf可以做到这一点:
read.csv.sql('sportsdb_sample_mysql_20080303.sql', sql="SELECT * FROM addresses") Error in sqliteSendQuery(con, statement, bind.data) : error in statement: no such table: addresses
即使在转储中肯定有一个表地址也是如此。sqldf列表上的该帖子提到了相同的错误,但没有解决方案。
然后sql.reader
,软件包中有一个函数ProjectTemplate
,看起来很有希望。随便看看,该功能的源代码可以在这里找到,它假设一个正在运行的数据库服务器并依赖于RMySQL
…而不是我所需要的。
所以…我们似乎用光了所有的选项。蜂巢的任何帮助表示赞赏!
(再次重申,我 不是
找依靠进入到SQL服务器的解决方案;与很容易dbReadTable
从RMySQL
,包我非常想绕过服务器,并从.SQL转储文件直接获取数据。)
根据要从表中提取的内容,这是如何处理数据的方法
numLines <- R.utils::countLines("sportsdb_sample_mysql_20080303.sql")
# [1] 81266
linesInDB <- readLines("sportsdb_sample_mysql_20080303.sql",n=60)
然后,您可以执行一些正则表达式来获取表名(在CREATE TABLE之后),列名(在第一括号之间)和VALUES(在CREATE
TABLE之后和第二括号之间的行)
编辑:响应OP的回答,如果我正确解释python脚本,它也将逐行读取它,过滤INSERT
INTO行,解析为csv,然后写入文件。这与我最初的建议非常相似。我的版本在R中。如果文件太大,最好使用一些其他R包以大块形式读取文件
options(stringsAsFactors=F)
library(utils)
library(stringi)
library(plyr)
mysqldumpfile <- "sportsdb_sample_mysql_20080303.sql"
allLines <- readLines(mysqldumpfile)
insertLines <- allLines[which(stri_detect_fixed(allLines, "INSERT INTO"))]
allwords <- data.frame(stri_extract_all_words(insertLines, " "))
d_ply(allwords, .(X3), function(x) {
#x <- split(allwords, allwords$X3)[["baseball_offensive_stats"]]
print(x[1,3])
#find where the header/data columns start and end
valuesCol <- which(x[1,]=="VALUES")
lastCols <- which(apply(x, 2, function(y) all(is.na(y))))
datLastCol <- head(c(lastCols, ncol(x)+1), 1) - 1
#format and prepare for write to file
df <- data.frame(x[,(valuesCol+1):datLastCol])
df <- setNames(df, x[1,4:(valuesCol-1)])
#type convert before writing to file otherwise its all strings
df[] <- apply(df, 2, type.convert)
#write to file
write.csv(df, paste0(x[1,3],".csv"), row.names=F)
})
问题内容: 如何从MySQL导入“ xxxx.sql”转储到PostgreSQL数据库? 问题答案: 不要指望没有编辑就可以工作。也许很多编辑。 mysqldump有一个兼容性参数,其中“名称”可以是“ oracle”或“ postgresql”,但这不能保证兼容性。我认为像ANSI_QUOTES这样的服务器设置也有一定作用。 如果包含用于创建转储的完整命令以及收到的任何错误消息,而不仅仅是说“对
问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 是否有任何文献记载的技术可以加快mySQL转储和导入的速度?
问题内容: 我正在尝试为我的LAMP项目设置Dockerfile,但是启动MySQL时遇到了一些问题。我在Dockerfile上有以下几行: 但我不断收到此错误: 关于如何在Dockerfile构建期间设置数据库创建和转储导入的任何想法? 问题答案: 中的每条指令都在不同的层中执行(如的文档中所述)。 在中,您有三个说明。问题是MySQL服务器仅在第一个启动。在其他版本中,没有MySQL正在运行,
关于如何在Dockerfile构建过程中设置数据库创建和转储导入有什么想法吗?
问题内容: 将csv文件上传到mysql表的最佳/最快方法是什么?我想将第一行数据用作列名。 发现了这一点: 如何将CSV文件导入MySQL表 但是唯一的答案是使用GUI而不是Shell? 问题答案: 您无需编写脚本即可从CSV文件中提取信息,而是可以直接将MYSQL链接到该文件并使用以下SQL语法上传信息。 要将Excel文件导入MySQL,请先将其导出为CSV文件。从生成的CSV文件中删除CS
问题内容: 一个菜鸟MYSQL用户....我有一个简单的MySQL查询,该查询返回值,并使用GROUP_CONCAT函数: 但是,我需要转置查询,以便它以单独的列而不是行的形式返回“名称”。MySQL完全有可能吗? 问题答案: 您需要执行一项操作,MySQL本身不支持该操作(与某些其他RDBMS不同)。 您可以获得的最接近的结果是按照以下几行构造SQL: 如果可能的值是动态的,则可以从以下结果中以