使用R下载压缩数据文件,提取和导入数据


122

Twitter上的@EZGraphs写道:“许多在线csv均已压缩。是否可以使用R下载,解压缩档案并将数据加载到data.frame中?” #Rstats

我今天也尝试这样做,但最终只是手动下载了zip文件。

我尝试了类似的东西:

fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")

但我觉得我还有很长的路要走。有什么想法吗?


奏效了吗?如果是这样,为什么您仍然觉得自己还有很长的路要走?
FrustratedWithFormsDesigner

@沮丧...不。我的问题中的代码不起作用。请参阅下面的答案。
Jeromy Anglim

Answers:


176

Zip存档实际上更多是带有内容元数据等的“文件系统”。有关help(unzip)详细信息,请参见。因此,要完成您上面概述的操作,您需要

  1. 创建一个临时工。文件名(例如tempfile()
  2. 用于download.file()将文件提取到临时文件中。文件
  3. 用于unz()从临时文件中提取目标文件。文件
  4. 通过删除临时文件 unlink()

在代码中(感谢基本示例,但这更简单)看起来像

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
data <- read.table(unz(temp, "a1.dat"))
unlink(temp)

压缩(.z)或gzipped(.gz)或bzip2ed(.bz2)文件只是这些文件,您可以直接从连接中读取它们。因此,让数据提供者改为使用它:)


德克,您介意扩展如何从.z档案中提取数据吗?我可以使用读取url连接readBin(url(x, "rb"), 'raw', 99999999),但是如何提取包含的数据?该uncompress软件包已从CRAN中删除-在R基座中是否可能(如果这样,是否仅限于* nix系统?)?如果合适,很高兴将其发布为新问题。
jbaums

3
请参阅help(gzfile)-我以为gzip协议现在也可以解压缩(原始的).z文件,因为该专利已经过期很久了。可能不会。谁仍然使用.z?1980年代打来的,他们想让自己的背部恢复压力;-)
Dirk Eddelbuettel

谢谢-我无法使它正常工作,所以也许毕竟它不受支持。不幸的是,澳大利亚气象局提供的某些数据为.z!
jbaums 2013年

仅供参考readRDS()(至少对我来说)。据我所知,该文件必须是一种您可以使用读取的文件read.table()
jessi 2014年

1
您还需要关闭连接。R一次只能打开125。像con <-unz(temp,“ a1.dat”); 数据<-read.table(con); close(con);
pdb

28

仅作记录,我尝试将Dirk的答案转换为代码:-P

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
con <- unz(temp, "a1.dat")
data <- matrix(scan(con),ncol=4,byrow=TRUE)
unlink(temp)

5
不要用scan(); 您可以read.table()直接在连接上使用et等。看到我编辑过的答案,
Dirk Eddelbuettel


9

对于Mac(我假设是Linux)...

如果zip归档文件包含单个文件,则可以使用bash命令 funzip结合使用fread以下data.table软件包中:

library(data.table)
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip")

如果归档文件包含多个文件,则可以tar改用将特定文件提取到stdout:

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")

当我尝试使用您的多个文件解决方案时,出现错误消息File is empty:
bshel​​t141

9

这是一个示例,适用于无法使用该read.table功能读取的文件。本示例读取一个.xls文件。

url <-"https://www1.toronto.ca/City_Of_Toronto/Information_Technology/Open_Data/Data_Sets/Assets/Files/fire_stns.zip"

temp <- tempfile()
temp2 <- tempfile()

download.file(url, temp)
unzip(zipfile = temp, exdir = temp2)
data <- read_xls(file.path(temp2, "fire station x_y.xls"))

unlink(c(temp, temp2))

5

为此,我使用data.table进行了以下工作。不幸的是,该链接不再起作用,因此我将链接用于另一个数据集。

library(data.table)
temp <- tempfile()
download.file("https://www.bls.gov/tus/special.requests/atusact_0315.zip", temp)
timeUse <- fread(unzip(temp, files = "atusact_0315.dat"))
rm(temp)

我知道这是可能的,因为您可以将bash脚本传递到fread,但是我不确定如何下载.zip文件,解压缩并将单个文件从传递到fread


4

试试这个代码。这个对我有用:

unzip(zipfile="<directory and filename>",
      exdir="<directory where the content will be extracted>")

例:

unzip(zipfile="./data/Data.zip",exdir="./data")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.