2017-12-03 85 views
1

我試圖自動將CSV文件寫入RSQLite數據庫。問題自動將CSV導入RSQLite數據庫

我這樣做是通過索引csvFiles來實現的,這是存儲在環境中的data.frame變量列表。

我似乎無法找出爲什麼當我手動輸入,但不是當我試圖指數namevalue領域我dbWriteTable()代碼工作完全正常。

### CREATE DB ### 
mydb <- dbConnect(RSQLite::SQLite(),"") 

# FOR LOOP TO BATCH IMPORT DATA INTO DATABASE 
for (i in 1:length(csvFiles)) { 
    dbWriteTable(mydb,name = csvFiles[i], value = csvFiles[i], overwrite=T) 
    i=i+1 
} 

# EXAMPLE CODE THAT SUCCESSFULLY MANUAL IMPORTS INTO mydb 
dbWriteTable(mydb,"DEPARTMENT",DEPARTMENT) 

當我運行的循環以上,我給出的這個錯誤:

"Error in file(file, "rt") : cannot open the connection 
In addition: Warning message: 
In file(file, "rt") : 
    cannot open file 'DEPARTMENT': No such file or directory 

# note that 'DEPARTMENT' is the value of csvFiles[1] 

這裏是csvFilesdput輸出:

c("DEPARTMENT", "EMPLOYEE_PHONE", "PRODUCT", "EMPLOYEE", "SALES_ORDER_LINE", 
"SALES_ORDER", "CUSTOMER", "INVOICES", "STOCK_TOTAL") 

我研究這個錯誤,它似乎與我的工作目錄有關;然而,我並不真正理解要改變什麼,因爲我甚至不試圖從我的電腦上操作文件,只是我的環境中已經有了data.frames。

請幫忙!

+0

你有'值= csvFiles [I]'用大寫'I'?你也不需要'i = i + 1'。多說一點,我們需要像'dput(head(csvFiles))'這樣的東西。 – vaettchen

+0

Hi @vaettchen,感謝您的支持。帶有大寫字母'I'的拼寫錯誤是我瀏覽器中的一個修正。這不是實際的代碼。任何想法爲什麼我的for循環不工作? – Morgan

+0

我想你的變量'csvFiles'有些問題。如果你可以發佈'dput()'出來?看起來不像我的工作目錄錯誤。 csv文件沒有擴展名(沒有'DEPARTMENT.csv'? – vaettchen

回答

0

只需使用get()說法是要傳遞一個字符串值,當一個數據幀對象的預期。注意您的手動版沒有DEPARTMENT引用

# FOR LOOP TO BATCH IMPORT DATA INTO DATABASE 
for (i in seq_along(csvFiles)) { 
    dbWriteTable(mydb,name = csvFiles[i], value = get(csvFiles[i]), overwrite=T) 
} 

另外,考慮建立一個名爲dataframes的列表,mget和循環的逐元素列表的名稱和DF元素之間用Map

dfs <- mget(csvfiles) 

output <- Map(function(n, d) dbWriteTable(mydb, name = n, value = d, overwrite=T), names(dfs), dfs) 
+0

這正是我尋找的信息,謝謝! – Morgan