使用 R 连接到共享点列表
Using R to connect to a sharepoint list
有没有人能够将 R 中的 SharePoint 列表作为数据框导入?
我有两个独立的数据源,一个来自 SharePoint 列表,另一个来自我希望 运行 进行分析的数据库。我能够毫无问题地连接到数据库,但似乎无法找到任何连接到 SharePoint 列表的内容。
SharePoint 服务器是 2007
我一直致力于使用 R 阅读 SharePoint 2010 列表一段时间。基本上,我使用 SharePoint Web 服务 return 列表中的结果,然后使用 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 服务,所以我可以在 return 结果之前筛选列表,这对于克服 SharePoint Web 服务的局限性非常有帮助。以下 link 很有帮助...
http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2010/01/21/introduction-to-querying-lists-with-rest-and-listdata-svc-in-sharepoint-2010.aspx
如果 ListData.svc 是 运行 and/or 您对 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)
以上答案仅适用于 <= 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)
}
有没有人能够将 R 中的 SharePoint 列表作为数据框导入?
我有两个独立的数据源,一个来自 SharePoint 列表,另一个来自我希望 运行 进行分析的数据库。我能够毫无问题地连接到数据库,但似乎无法找到任何连接到 SharePoint 列表的内容。
SharePoint 服务器是 2007
我一直致力于使用 R 阅读 SharePoint 2010 列表一段时间。基本上,我使用 SharePoint Web 服务 return 列表中的结果,然后使用 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 服务,所以我可以在 return 结果之前筛选列表,这对于克服 SharePoint Web 服务的局限性非常有帮助。以下 link 很有帮助... http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2010/01/21/introduction-to-querying-lists-with-rest-and-listdata-svc-in-sharepoint-2010.aspx
如果 ListData.svc 是 运行 and/or 您对 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)
以上答案仅适用于 <= 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)
}