2014-04-29 47 views
3

正如我相當新的R,我想學習如何我可以從一個XML文件,並遍歷5603提取兩個值其他(小的,< 2kb)我的工作目錄中的XML文件。在R,如何從XML文件中提取兩個值,遍歷5603文件,並寫入表

我一直在閱讀了很多關於「循環」的話題,但覺得這相當混亂 - 尤其是因爲它似乎是遍歷XML文件是從遍歷其他文件,正確的有什麼不同?

我在XML結構中使用在線數據。

因爲我想寫「郵編」和「AwardAmount」的表中的每個XML文件。

運行下面的代碼我做了檢索和郵編AwardAmount,但只是從一開始的文件。我如何寫一個適當的循環並將其寫入表格?

xmlfiles=list.files(pattern="*.xml") 
for (i in 1:length(xmlfiles)){ 
    doc= xmlTreeParse("xmlfiles[i]", useInternal=TRUE) 
    zipcode<-xmlValue(doc[["//ZipCode"]]) 
    amount<-xmlValue(doc[["//AwardAmount"]]) 
} 

有沒有人有一些建議?

+1

好''xmlfiles [i]「'絕對不會奏效。嘗試使用'paste(xmlfiles,seq_along(xmlfiles),sep =「」)' –

回答

4

這可能適合你。我擺脫了for循環,並與sapply去。

xmlfiles <- list.files(pattern = "*.xml") 
txtfiles <- gsub("xml", "txt", xmlfiles, fixed = TRUE) 

txtfiles是一組新的文件名被用作每次運行的輸出文件。

sapply(seq(xmlfiles), function(i){ 

    doc <- xmlTreeParse(xmlfiles[i], useInternal = TRUE) 
    zipcode <- xmlValue(doc[["//ZipCode"]]) 
    amount <- xmlValue(doc[["//AwardAmount"]]) 
    DF <- data.frame(zip = zipcode, amount = amount) 
    write.table(DF, quote = FALSE, row.names = FALSE, file = txtfiles[i]) 

}) 

請讓我知道是否有問題,當你運行它。

+1

Richard創建文件名,非常感謝!代碼就像一個魅力。謝謝! –

+0

太好了。我很高興它爲你工作。 –

2

稍微不同的方式來理查德(只是一點點)。在將其寫出到文件之前,使用ldply來製作數據幀。你應該選擇他的答案,因爲「膽」的ldply功能是他的,但是這正說明這樣做的另一種方式(假設你想一個文件VS許多文件):

setwd("LOCATION_OF_XML_FILES") 

xmlfiles <- list.files(pattern = "*.xml") 

dat <- ldply(seq(xmlfiles), function(i){ 

    doc <- xmlTreeParse(xmlfiles[i], useInternal = TRUE) 

    zipcode <- xmlValue(doc[["//ZipCode"]]) 
    amount <- xmlValue(doc[["//AwardAmount"]]) 

    return(data.frame(zip = zipcode, amount = amount)) 

}) 

head(dat) 
##   zip amount 
## 1 442420001 45000 
## 2 479072114 400580 
## 3 303320420 22050 
## 4 326112002 12000 
## 5 265066845 37000 
## 6 168027000 300000 

write.csv(dat, "zipamount.csv", row.names=FALSE) 

你可以使用append=TRUE與理查德的方法,並使用該單一文件名write.table做同樣的事情。您還可以調整write.csv(或write.table)的輸出設置以獲取最終想要使用的輸出格式。

您還可以添加recursive = TRUElist.files要經過的所有子目錄VS把所有〜5600個文件到一個目錄(可以對一些文件系統/操作系統的性能問題)。

+0

hrbrmstr,非常感謝您的意見。使用你的方法,我能夠構建一個文件。你的評論幫助我更好地理解發生了什麼。謝謝。 –

相關問題