2015-03-31 3 views
0

Мне нужно (не вручную) загрузить этот файл и преобразовать содержимое в data.frame, было бы полезно игнорировать несколько строк. Я ищу специально для решения в R или Python.XLS to CSV или R data.frame

Сам файл может быть взят из:

http://horizons.prod.transmissionmedia.ca/GetDailyFundSummaryExcel.aspx?lang=en

Вот что я сделал до сих пор:

  1. Я попытался XLConnect (Error: IllegalArgumentException (Java): Your InputStream was neither an OLE2 stream, nor an OOXML stream)
  2. Я ve попытался RODBC (Error in odbcConnectExcel("xl.file") : odbcConnectExcel is only usable with 32-bit Windows)
  3. Я пробовал xlrd в Python (XLRDError: Unsupported format or corrupt file)
  4. Я попытался GData (Error in xls2sep(xls, sheet, verbose = verbose, ..., method = method, : Intermediate file '...' missing!)

Если открыть файл в блокноте, это файл XML, и при открытии в Excel, вы получите предупреждающее сообщение «Формат и расширение не совпадают ».

Идеи, которые я могу исследовать сами, также полезны, если у вас нет ответа, прокомментируйте.

Моя попытка до сих пор с XML/регулярное выражение:

library(XML) 
library(stringr) 
download.file("http://horizons.prod.transmissionmedia.ca/GetDailyFundSummaryExcel.aspx?lang=en", destfile = "horizons.xls") 
doc <- readLines(con = "horizons.xls") 
doc <- str_extract(doc,"<Table[^>]*>(.*?)</Table>") 
doc <- xmlParse(doc) 
listing <- xpathApply(doc, "//Row", xmlToDataFrame) 
listing <- listing[4:length(listing)] 
listing <- do.call(rbind,lapply(listing, t))[,6:16] 
listing[,3:11] <- gsub("[^-.0-9]", "", listing[,3:11]) 
listing <- as.data.frame(listing, row.names = NULL,stringsAsFactors = FALSE,) 
listing$V1 <- str_replace_all(listing$V1, "[^a-zA-Z0-9]", " ") 
listing[5:11] <- lapply(listing[5:11],as.numeric) 
names(listing) <- c(
    "Product Name", 
    "Ticker", 
    "Class", 
    "Price", 
    "Price % Change", 
    "Volume", 
    "NAV/unit", 
    "NAV % Change", 
    "% Prem/Disc", 
    "Outst. Shares" 
) 
+0

Ьгу read.xls http://www.r-bloggers.com/read-excel- files-from-r/ – Sathish

+0

Во-первых: Не загружайте файл в Internet Explorer как * в некоторых версиях «он меняет расширение файла с .xls на .xml без необходимости. –

+0

Во-вторых: Вы считали, что вы сами разбираете XML? –

ответ

2

Может быть способ сделать это в R:

library(XML) 
download.file("http://horizons.prod.transmissionmedia.ca/GetDailyFundSummaryExcel.aspx?lang=en", file.path(tempdir(), "xls.xml")) 
doc <- xmlParse(file.path(tempdir(), "xls.xml")) 
df <- xmlToDataFrame(nodes = getNodeSet(doc, "//ss:Row", "ss")[-(1:2)], stringsAsFactors = FALSE) 
names(df) <- unlist(df[1, ], use.names = F); df <- df[-1, ] # put first row as col header and delete it 
head(df) 
# # # Language   ETF Type    Subtype         Product Name Ticker Class Closing Date Price Price % Change Volume NAV/unit NAV % Change % Prem/Disc Outst. Shares 
# 2 1 1  en INDEX AND BENCHMARK Equities — Large Cap     Horizons S&P 500® Index ETF HXS   2015-03-30 47.3800   2.09 314223 47.4302  1.9621  -0.11  5675671 
# 3 2 2  en              Horizons S&P 500® Index ETF (US$) HXS.U   2015-03-30 37.2800   -0.19 52769 37.3539  1.2312  -0.20  5675671 
# 4 3 3  en              Horizons S&P/TSX 60™ Index ETF HXT   2015-03-30 27.9600   0.98 372656 27.9144  0.9095  0.16  22019328 
# 5 4 4  en             Horizons S&P/TSX 60™ Index ETF (US$) HXT.U   2015-03-30 22.0300   -0.56  0 21.9842  0.1864  0.21  22019328 
# 6 5 5  en            Horizons S&P/TSX Capped Energy Index ETF HXE   2015-03-30 21.4800   0.00 1200 21.5441  0.6578  -0.30  902485 
# 7 6 6  en           Horizons S&P/TSX Capped Financials Index ETF HXF   2015-03-30 30.0100   0.00 900 30.0804  0.1395  -0.23  500440 
+0

Очень приятно. У меня что-то очень похожее, но и намного уродливое. Как вы узнали, как использовать xmlToDataFrame и getNodeSet и // ss: Row? Я имею в виду - где вы научились это делать? –

+1

В основном из [stackoverflowing] (http://stackoverflow.com/questions/tagged/r+xml) и 'help (package =" XML ")' ... :-) – lukeA

+0

1. http: //www.omegahat .org/RSXML/Tour.pdf 2. http://cran.r-project.org/web/packages/XML/XML.pdf – Sathish

1

Это может быть не лучшим образом, но поможет дать некоторые головы с ним.

require("XML") 

myfile1 <- download.file(http://horizons.prod.transmissionmedia.ca/GetDailyFundSummaryExcel.aspx?lang=en) 

doc <- xmlParse(myfile1) 

root_doc <- xmlRoot(doc) 

identify_worksheet <- c() 

for (i in 1:xmlSize(root_doc)){ 
    identify_worksheet <- c(identify_worksheet, xmlName(root_doc[[i]]) == "Worksheet") 
} 

worksheet_index = which(identify_worksheet == TRUE) 

name1 <- xmlSApply(root_doc[[worksheet_index]], xmlName) 

row_size <- xmlSize(root_doc[[worksheet_index]][[name1]]) 

col_size = max(xmlSApply(root_doc[[worksheet_index]][[name1]], xmlSize)) 

row_index = which(xmlSApply(root_doc[[worksheet_index]][[name1]], xmlSize) == max(xmlSApply(root_doc[[worksheet_index]][[name1]], xmlSize))) 

df1 <- data.frame(matrix(nrow = length(row_index)-1, ncol = col_size), stringsAsFactors = FALSE) 

colnames(df1) <- getChildrenStrings(root_doc[[worksheet_index]][[name1]][[row_index[1]]]) 

for(i in 2:length(row_index)){ 
    df_index = i-1 
    df1[df_index,] <- getChildrenStrings(root_doc[[worksheet_index]][[name1]][[row_index[i]]]) 
} 

View(df1) 

df2 <- df1[4:ncol(df1)] 

View(df2) 

Идентифицировать имена с листа Excel в формате xml. Я хотел бы знать, что следующие названия соответствуют стандарту для листа excel в формате xml, а также при наличии нескольких рабочих листов имена рабочих листов растут с номером в качестве суффикса (например: Worksheet1, Worksheet2 и т. Д.). .).

xmlName(root_doc) 
[1] "Workbook" 
xmlName(root_doc[[1]]) 
[1] "DocumentProperties" 
xmlName(root_doc[[2]]) 
[1] "Styles" 
xmlName(root_doc[[3]]) 
[1] "Worksheet" 

выход

head(df1) 
    # # Language   ETF Type    Subtype         Product Name Ticker Class Closing Date Price Price % Change Volume 
1 1 1  en INDEX AND BENCHMARK Equities — Large Cap     Horizons S&P 500® Index ETF HXS   2015-03-30 47.3800   2.09 314223 
2 2 2  en              Horizons S&P 500® Index ETF (US$) HXS.U   2015-03-30 37.2800   -0.19 52769 
3 3 3  en              Horizons S&P/TSX 60™ Index ETF HXT   2015-03-30 27.9600   0.98 372656 
4 4 4  en             Horizons S&P/TSX 60™ Index ETF (US$) HXT.U   2015-03-30 22.0300   -0.56  0 
5 5 5  en            Horizons S&P/TSX Capped Energy Index ETF HXE   2015-03-30 21.4800   0.00 1200 
6 6 6  en           Horizons S&P/TSX Capped Financials Index ETF HXF   2015-03-30 30.0100   0.00 900 
    NAV/unit NAV % Change % Prem/Disc Outst. Shares 
1 47.4302  1.9621  -0.11  5675671 
2 37.3539  1.2312  -0.20  5675671 
3 27.9144  0.9095  0.16  22019328 
4 21.9842  0.1864  0.21  22019328 
5 21.5441  0.6578  -0.30  902485 
6 30.0804  0.1395  -0.23  500440 

head(df2) 
      ETF Type    Subtype         Product Name Ticker Class Closing Date Price Price % Change Volume NAV/unit 
1 INDEX AND BENCHMARK Equities — Large Cap     Horizons S&P 500® Index ETF HXS   2015-03-30 47.3800   2.09 314223 47.4302 
2              Horizons S&P 500® Index ETF (US$) HXS.U   2015-03-30 37.2800   -0.19 52769 37.3539 
3              Horizons S&P/TSX 60™ Index ETF HXT   2015-03-30 27.9600   0.98 372656 27.9144 
4             Horizons S&P/TSX 60™ Index ETF (US$) HXT.U   2015-03-30 22.0300   -0.56  0 21.9842 
5            Horizons S&P/TSX Capped Energy Index ETF HXE   2015-03-30 21.4800   0.00 1200 21.5441 
6           Horizons S&P/TSX Capped Financials Index ETF HXF   2015-03-30 30.0100   0.00 900 30.0804 
    NAV % Change % Prem/Disc Outst. Shares 
1  1.9621  -0.11  5675671 
2  1.2312  -0.20  5675671 
3  0.9095  0.16  22019328 
4  0.1864  0.21  22019328 
5  0.6578  -0.30  902485 
6  0.1395  -0.23  500440 
+0

Да, к сожалению, это, вероятно, будет запускаться ежедневно на nix, где нет такой вещи, как excel, блокнот или что у вас есть. –