1

これは私を怒らせています。

私はcsvファイル「hello.csv」を持っています

a,b
"drivingme,mad",1

これをR内からsqliteデータベースに変換したいだけです(実際のファイルは実際には10Gであり、data.frameに収まらないため、これを行う必要があるため、Sqliteを中間データストアとして使用します)

dbWriteTable(conn= dbConnect(SQLite(), 
            dbname="c:/temp/data.sqlite3", 
             name="data", 
             value="c:/temp/hello.csv",row.names=FALSE, header=TRUE)

上記のコードはエラーで失敗しました

Error in try({ : 
  RS-DBI driver: (RS_sqlite_import: c:/temp/hello.csv line 2 expected 2 columns of data but found 3)
In addition: Warning message:
In read.table(fn, sep = sep, header = header, skip = skip, nrows = nrows,  :
  incomplete final line found by readTableHeader on 'c:/temp/hello.csv'

引用符 "" 内のコンマ (,) を扱うように指示するにはどうすればよいですか?

引数を追加してみました

quote="\""

しかし、うまくいきませんでした。ヘルプ!!read.csv はファイルだけで機能しますが、大きなファイルを読み取ると失敗します。

4

3 に答える 3

3

アップデート

はるかに良いのは、readrのチャンク関数を使用することです。

#setting up sqlite
con_data = dbConnect(SQLite(), dbname="yoursqlitefile")

readr::read_delim_chunked(file, function(chunk) {
  dbWriteTable(con_data, chunk, name="data", append=TRUE )) #write to sqlite 
})

元のより面倒な方法

read.csv は機能しますが、データ全体をメモリにロードできないため、これを行う 1 つの方法はファイルから読み取ることです。

    n = 100000 # experiment with this number
    f = file(csv) 
    con = open(f) # open a connection to the file
    data <-read.csv(f,nrows=n,header=TRUE)
    var.names = names(data)    
 
    #setting up sqlite
    con_data = dbConnect(SQLite(), dbname="yoursqlitefile")
  
    while(nrow(data) == n) { # if not reached the end of line
      dbWriteTable(con_data, data, name="data",append=TRUE )) #write to sqlite 
      data <-read.csv(f,nrows=n,header=FALSE))
      names(data) <- var.names      
    } 
    close(f)
    if (nrow(data) != 0 ) {      
      dbWriteTable(con_data, data, name="data",append=TRUE ))
于 2013-06-19T07:20:33.663 に答える