繁体   English   中英

XLS转换为CSV或R data.frame

XLS to CSV or R data.frame

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我需要(非手动)下载此文件并将内容转换为data.frame,忽略几行的功能将非常有用。 我正在专门寻找R或Python解决方案。

该文件本身可以取自:

http://horizo​​ns.prod.transmissionmedia.ca/GetDailyFundSummaryExcel.aspx?lang=zh-CN

到目前为止,这是我所做的:

  1. 我尝试了XLConnect( Error: IllegalArgumentException (Java): Your InputStream was neither an OLE2 stream, nor an OOXML stream
  2. 我已经尝试过RODBC( Error in odbcConnectExcel("xl.file") : odbcConnectExcel is only usable with 32-bit Windows
  3. 我在Python中尝试了xlrd( XLRDError: Unsupported format or corrupt file
  4. 我试过gdata( Error in xls2sep(xls, sheet, verbose = verbose, ..., method = method, : Intermediate file '...' missing!

如果在记事本中打开文件,它是一个xml文件,并且在Excel中打开时,您将收到一条警告消息“格式和扩展名不匹配”。

我可以探索的想法也很有用,如果您没有答案,请发表评论。

到目前为止,我对XML / regex的尝试是:

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"
)
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

这可能不是最好的方法,但将有助于您有所准备。

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)

从xml格式的Excel工作表中识别名称。 我想知道,以下名称是xml格式的excel工作表的标准名称,并且当存在多个工作表时,工作表的名称是否以数字后缀(例如: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
1 R | data.frame转换为“纯文本”

我需要将data.frame对象“转换”为纯文本(例如print到控制台的输出)。 到目前为止,我创建了以下函数(使用stringr程序包),但我想知道是否存在已实现的函数或更有效的方法: 我添加了一些可运行的代码以及一个输出示例(每个输出行都由“ |”分隔) ...

2 R:将列表转换为data.frame

我有一个看起来像这样的列表: 其中一些元素为NULL ,而其他元素可以有多个子元素,例如第三个元素有子元素[[1]]和[[2]] 。 我想将这些列表元素组合成一个看起来像这样的data.frame(为方便起见,我省略了Score2到Score6列的内容): 我尝试过以下但 ...

3 R将data.frame转换为Zoo

我有一个很大的data.frame,整个数据集是从csv加载的。 日期存储在第1列中,类似于20130614,在我的情况下是MergedSet $ Date。 如何创建整个data.frame的Zoo对象? 我在其他帖子中发现了一些提示,但是无法正常工作: read.zoo(. ...

4 R将data.frame转换为json

我正在尝试将data.frame转换为json格式 我的data.frame具有以下结构 我想要创建的是这样的东西(最终将其打印到.json文件中) 我已经尝试过处理json格式的其他程序包,但到目前为止未能产生这种输出。 我通常会得到这样的结果 ...

6 当转换为data.matrix的数字data.frame时,R对csv做什么?

我有一个CSV文件。 它位于scikit.learn库中。 在用python构建任何预测模型之前,我想看一下每个属性与key属性的相关性。 因此,我导入了CSV文件,如下所示: 现在,我似乎无法执行任何描述性统计信息,也无法运行cor(y [,1:13],y [,14])。 它说 ...

7 当我将data.frame转换为CSV时,R中的数据类型被更改

我想将R数据帧导出到csv。 我正在使用readr的1.write.csv或2.write_csv将其导出到csv。 但是,当我导出它时,数据类型会发生变化,这给了我更奇怪的结果。 我们如何避免这个问题? 这是数据框中列的数据类型 当我将其导出到csv并稍后以其他代码导入时,这是csv文件的数 ...

9 R:将data.frame转换为具有正确尺寸的data.frame

我有一个名为exp_epis_2的data.frame,看起来像这样: 我希望这样看: 我非常确定这很简单,但是我似乎找不到一个好的答案。 编辑:每个请求,这是dput(head(exp_epis_2))的输出: 也许像这样更容易看到它。 在我的原始帖子中,我将每 ...

2017-03-09 21:22:10 2 33   r
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM