0

由于我的硬件非常有限(具有 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")

非常感谢任何帮助甚至是一个小提示!

4

0 回答 0