web-dev-qa-db-ja.com

Rを使用して共有ポイントリストに接続する

SharePointのリストをデータフレームとしてRにインポートできる人はいますか?

2つの個別のデータソースがあります。1つはSharePointリストから、もう1つは分析を実行するDBからです。問題なくDBに接続できましたが、SharePointリストに接続するためのものが見つかりません。

SharePointサーバーは2007年

14
John Smith

しばらくの間、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

13
Lee Mendoza

LeeDataの回答は、ListData.svcが実行されているか、SharePointサーバーへの管理アクセス権を持っている場合に有効です。

これらの両方が当てはまらない場合:次の方法で問題が解決する可能性があります。少なくとも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)
3
David Wagle

上記の回答は、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)
}
1
SharpSharpLes