2017-02-23 59 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

相关问题