首页 > 解决方案 > 从 R 中下载和打开 xlsx 文件的问题

问题描述

我想直接从 R 中下载并打开以下包含月度和年度消费者价格指数的 Excel 文件。

https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master (链接可以在本站找到:https ://www.bfs.admin.ch/bfs/de/home/statistiken /preise/landesindex-konsumentenpreise/lik-resultate.assetdetail.7066959.html )

我曾经使用浏览器手动下载此文件,将其保存在本地计算机上,然后使用 R 打开 xlsx 文件并毫无问题地处理数据。

我现在尝试直接从 R 中读取文件,但到目前为止还没有运气。从上面的 URL 可以看出,没有 .xlsx 扩展名等,所以我认为文件以某种方式压缩。这是我到目前为止所尝试的以及我被卡住的地方。

library(foreign)
library(xlsx)


# in a browser, this links opens or dowloads an xlsx file
likurl <- "https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master"

temp <- tempfile()
download.file(likurl, temp)

list.files <- unzip(temp,list=TRUE)

data <- read.xlsx(unz(temp,
                  + list.files$Name[8]), sheetIndex=2)

最后一步的结果是

 Error in +list.files$Name[8] : invalid argument to unary operator

我不太了解 unz 函数,但是在阅读 unz 的帮助文件时可以看出这是错误的(我在网上某处找到了这个建议的解决方案)。

我还尝试了以下不同的方法:

library(XLConnect)
likurl <- "https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master"

tmp = tempfile(fileext = ".xlsx")
download.file(likurl, tmp)
readWorksheetFromFile(tmp, sheet = 2, startRow = 4, 
                  colNames = TRUE, rowNames = FALSE)

最后一行作为结果返回:

 Error: ZipException (Java): invalid entry size (expected 1644 but got 1668 bytes)

在将数据从 excel 读入 R 时,我将非常感谢有关如何打开这些数据并像往常一样使用它的任何帮助。提前非常感谢!

标签: rexceldownload

解决方案


感谢@Johnny 的提示,这是我的解决方案。使用 xlsx 包中的 read.xlsx(而不是上面链接中建议的 read_excel)从 excel 中读取数据效果更好。

一些丑陋的细节仍然存在于列的命名方式(colNames 没有正确传递,除了第一列和第 11 列)以及从传递给 read.xlsx 的选项创建的新列是多么奇怪(例如,名为 colNames 的列,所有条目 == TRUE;有关详细信息,请参阅带有 str(LIK.m)) 的输出结构。但是,这些将是另一个问题,目前,它们可以以快速而肮脏的方式修复:-)。

library(httr)
library(foreign)
library(xlsx)

# in a browser, this links opens or dowloads an xlsx file
likurl<-'https://www.bfs.admin.ch/bfsstatic/dam/assets/7066959/master'
p1f <- tempfile()
download.file(likurl, p1f, mode="wb")

GET(likurl, write_disk(tf <- tempfile(fileext = ".xlsx")))


# annual CPI
LIK.y <- read.xlsx(tf,
             sheetIndex = 2, startRow = 4,
             colNames = TRUE, rowNames = FALSE, stringsAsFactors = FALSE,
             detectDates = FALSE, skipEmptyRows = TRUE, skipEmptyCols = TRUE ,  
             na.strings = "NA", check.names = TRUE,  fillMergedCells = FALSE)

LIK.y$X. <- as.numeric(LIK.y$X.)

str(LIK.y)


# monthly CPI
LIK.m <- read.xlsx(tf,
             sheetIndex = 1, startRow = 4,
             colNames = TRUE, rowNames = FALSE, stringsAsFactors = FALSE,
             detectDates = FALSE, skipEmptyRows = TRUE, skipEmptyCols = TRUE ,  
             na.strings = "NA", check.names = TRUE,  fillMergedCells = FALSE)

LIK.m$X. <- as.numeric(LIK.m$X.)

str(LIK.m)

推荐阅读