使用R连接到共享点列表

时间:2015-03-01 10:04:10

标签: r sharepoint dataframe sharepoint-list

是否有人能够将R中的SharePoint列表导入为数据框?

我有两个独立的数据源,一个来自SharePoint列表,另一个来自我希望运行分析的数据库。我可以毫无问题地连接到数据库,但似乎无法找到任何连接到SharePoint列表的内容。

SharePoint服务器是2007

3 个答案:

答案 0 :(得分:11)

我一直在使用R阅读SharePoint 2010列表一段时间。基本上,我使用SharePoint Web服务从列表中返回结果,然后使用xmlToDataFrame转换为数据帧。

URL <- "http://yoursharepointserver/_vti_bin/ListData.svc/yourlist"    
data = xmlParse(readLines(URL))

## get the individual list items    
items = getNodeSet(data, "//m:properties")

## convert to a data frame
df = xmlToDataFrame(items, stringsAsFactors = FALSE)

由于我正在使用Web服务,因此我可以在返回结果之前过滤列表,这对克服SharePoint Web服务的限制非常有帮助。以下链接非常有用...... http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2010/01/21/introduction-to-querying-lists-with-rest-and-listdata-svc-in-sharepoint-2010.aspx

答案 1 :(得分:3)

如果ListData.svc正在运行和/或您具有SharePoint服务器的管理访问权限,那么Lee Mendoza的答案可能会有效。

如果两者都不成立:以下内容可能有效。至少它在SharePoint 2010上对我有用。如果在ListData.svc不存在时有更好的方法,我很乐意听到它。

 library(RCurl)
 library(XML)
 library(data.table)
 URL <- "http://<site>/_vti_bin/owssvr.dll?Cmd=Display&Query=*&XMLDATA=TRUE&List={GUID_OF_LIST}"
 rawData <- getURL(URL, userpwd = "username:password")
 # in real life  prompt for user credentials, don't put in script
 xmlData <- xmlParse (rawData, options=HUGE, useInternalNodes=TRUE)
 dataList <- xmlToList(xmlRoot(xmlData)[["data"]])
 # check the system return, on my SP2010 server the data block is 
 # named rs:data so this works
 dataMatrix <- do.call(rbind,dataList)
 finalDataTable <- data.table(dataMatrix)

答案 2 :(得分:0)

以上答案适用于仅<= 1000行的列表。使用URL中的“ $ Top”和“ $ Skip”,您可以使用下面的函数进行多次迭代,并从列表中导入所有数据,而不管其大小如何。 (这可能不是最干净的编写方式,但是可以!)

sp_import <- function(ListName) {

        urlstring <- "http://yoursharepointserver/_vti_bin/ListData.svc/yourlist" 
        data <- xmlParse(readLines(paste(urlstring, ListName, sep = ""), warn = FALSE))
        items <- getNodeSet(data, "//m:properties")
        df <- xmlToDataFrame(items, stringsAsFactors = FALSE)
        iterate <- nrow(df)
        skip <- 1

        while (nrow(df) == 1000 * skip) {
            data <- xmlParse(readLines(paste(urlstring, ListName, "?$top=1000&$skip=", iterate, sep = ""), warn = FALSE))
            items <- getNodeSet(data, "//m:properties")
            df <- rbind(df, xmlToDataFrame(items, stringsAsFactors = FALSE))
            iterate <- nrow(df)
            skip <- skip + 1
        }
        return(df)
}