0

私のハードウェアは非常に限られているため (32 ビットの Win7 と 4 GB の RAM を備えたデュアル コア - 私はそれを最大限に活用する必要があります...)、大きなテキスト ファイル (約 1.2 GB) を DB に保存しようとしました。これを SQL のようなクエリでトリガーして、特定のサブグループに対して何らかの分析を行うことができます。

正直なところ、私はこの分野に詳しくありません。「グーグル」で問題に関するヘルプを見つけることができなかったので、思いついたことと、物事がどのように見えるかを簡単に示します。

まず、txt ファイルに含まれる列の数を確認します。

k <- length(scan("data.txt", nlines=1, sep="\t", what="character"))

次に、テキスト ファイルへの接続を開き、1 行ごとに再度開く必要がないようにします。

filecon<-file("data.txt", open="r")

次に、SQLite データベースへの接続 (dbcon) を初期化します。

dbcon<- dbConnect(dbDriver("SQLite"), dbname="mydb.dbms")

1行目の位置がどこかわかる

pos<-seek(filecon, rw="r")

最初の行には列名が含まれているため、後で使用するために保存します

col_names <- unlist(strsplit(readLines(filecon, n=1), "\t"))

次に、最初の 10 行を 1 行ずつ読み取り、それらを DB に保存することをテストします。DB 自体に k - column-names = 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