由于我的硬件非常有限(具有 32 位 Win7 和 4GB 内存的双核 - 我需要充分利用它.....)我尝试将一个大文本文件(大约 1.2GB)保存到数据库中,然后我可以通过类似 SQL 的查询触发它,对特定的子组进行一些分析。
老实说,我不熟悉这个领域,并且由于我无法通过“谷歌搜索”找到有关我的问题的帮助,所以我只是快速展示了我的想法以及我认为事情会是什么样子:
首先我检查我的 txt 文件有多少列:
k <- length(scan("data.txt", nlines=1, sep="\t", what="character"))
然后我打开一个到文本文件的连接,这样就不需要为每一行再次打开它:
filecon<-file("data.txt", open="r")
然后我初始化一个到 SQLite 数据库的连接(dbcon)
dbcon<- dbConnect(dbDriver("SQLite"), dbname="mydb.dbms")
我找出第一行的位置在哪里
pos<-seek(filecon, rw="r")
由于第一行包含列名,因此我将它们保存以备后用
col_names <- unlist(strsplit(readLines(filecon, n=1), "\t"))
接下来,我测试逐行读取前 10 行,并将它们保存到数据库中,数据库本身(应该)包含 k - 列名称 = col_names 的列。
for(i in 1:10) {
# prints the iteration number in hundreds
if(i %% 100 == 0) {
print(i)
}
# read one line into a variable tt
tt<-readLines(filecon, n=1)
# parse tt into a variable tt2, since tt is a string
tt2<-unlist(strsplit(tt, "\t"))
# Every line, read and parsed from the text file, is immediately saved
# in the SQLite database table "results" using the command dbWriteTable()
dbWriteTable(conn=dbcon, name="results", value=as.data.frame(t(tt2[1:k]),stringsAsFactors=T), col.names=col_names, append=T)
pos<-c(pos, seek(filecon, rw="r"))
}
如果我运行它,我会收到以下错误
Warning messages:
1: In value[[3L]](cond) :
RS-DBI driver: (error in statement: table results has 738 columns but 13 values were supplied)
为什么要提供 738 列?如果我将 k(即 12)更改为 738,则代码可以工作,但是我需要通过 V1、V2、V3 ......而不是我打算提供的列名来触发列
res <- dbGetQuery(dbcon, "select V1, V2, V3, V4, V5, V6 from results")
非常感谢任何帮助甚至是一个小提示!