2017-02-23 101 views
1

我是使用Postgresql的新手,並且在填充使用多個* .csv文件創建的表時遇到問題。我首先在pgAdmin4中工作,然後決定在RPostgreSQL上工作,因爲R是我的主要語言。RPostgreSQL將多個CSV文件加載到Postgresql表中

無論如何,我正在處理(現在)與30 csv文件位於一個文件夾中。全部具有相同的標題和通用結構,例如:

Y:/Clickstream/test1/video-2016-04-01_PARSED.csv 
Y:/Clickstream/test1/video-2016-04-02_PARSED.csv 
Y:/Clickstream/test1/video-2016-04-03_PARSED.csv 

...等等。

我試圖通過使用以下來自Parfait的RPostgresql特定答案加載所有csv文件。可悲的是,它沒有奏效。我的代碼如下規定:

library(RPostgreSQL) 

dir = list.dirs(path = "Y:/Clickstream/test1") 
num = (length(dir)) 

psql.connection <- dbConnect(PostgreSQL(), 
        dbname="coursera", 
        host="127.0.0.1", 
        user = "postgres", 
        password="xxxx") 

for (d in dir){ 
    filenames <- list.files(d) 

for (f in filenames){ 
    csvfile <- paste0(d, '/', f) 

# IMPORT USING COPY COMMAND 
sql <- paste("COPY citl.courses FROM '", csvfile , "' DELIMITER ',' CSV ;") 
dbSendQuery(psql.connection, sql) 

    } 
} 

# CLOSE CONNNECTION 
dbDisconnect(psql.connection) 

我不理解,我得到了錯誤:

Error in postgresqlExecStatement(conn, statement, ...) : 
RS-DBI driver: (could not Retrieve the result : ERROR: could not open file 
" Y:/Clickstream/test1/video-2016-04-01_PARSED.csv " for reading: Invalid 
argument 
) 

如果我理解正確的,有我的第一個文件名無效參數。我對此不太確定,但我最近又在R中使用了PostgreSQL和這個RPostgreSQL。任何幫助都將非常感謝。

在此先感謝!

編輯:我發現問題,但由於某種原因無法解決問題。當我複製,而在for循環的路徑:

# IMPORT USING COPY COMMAND 
sql <- paste("COPY citl.courses FROM '",csvfile,"' DELIMITER ',' CSV ;") 

我有以下結果:

sql 
[1] "COPY citl.courses FROM ' Y:/Clickstream/test1/video-2016-04-01_PARSED.csv ' DELIMITER ',' CSV ;" 

這意味着無效的參數是文件路徑之間的空白。我試圖改變這個失敗。任何幫助將深表感謝!

+0

1. COPY命令運行和文件也必須是在服務器上。 2.請檢查文件權限 - 必須允許閱讀'postgres'用戶 –

+0

Hi Roman。非常感謝您的評論。恐怕我對psql不是很熟悉,所以我在理解你的2個答案時遇到了一些麻煩。請糾正我,如果我錯誤解釋他們:1)你的意思是在服務器上的文件?實際上,我的所有文件都在服務器上,但它們尚未裝載到psql中。 2)我是超級用戶,在我的數據庫中擁有所有權利。我在我的文件所在的服務器上也有管理權限。 – lescobedo21

回答

0

嘗試一些像服務器這樣

Files <- list.files("Y:/Clickstream/test1", pattern = "*.csv", full.names = TRUE) 

CSVs <- lapply(Files, read.csv) 

psql.connection <- dbConnect(PostgreSQL(), 
        dbname="coursera", 
        host="127.0.0.1", 
        user = "postgres", 
        password="xxxx") 


for(i in 1:length(Files)){ 

    dbWriteTable(psql.connection 
    # schema and table 
    , c("citl", "courses") 
    , CSVs[i] 
    , append = TRUE # add row to bottom 
    , row.names = FALSE 
    ) 

} 
+1

嗨JackStat。感謝您的回答。我試圖避免加載R中的文件,因爲它們合計11千兆字節(僅用於測試文件夾)。如果他們不那麼「沉重」,你的代碼肯定會適合我的情況。我的意圖是在psql中加載文件以使事情更快。再次,非常感謝! – lescobedo21