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

Jer*_*lim 118 connection zip r

@EZGraphs在Twitter上写道:"很多在线csv都是压缩的.有没有办法下载,解压缩档案,并使用R?#Rstats将数据加载到data.frame"

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

我尝试过类似的东西:

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

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

Dir*_*tel 165

Zip档案实际上更像是一个带有内容元数据等的"文件系统".详情请参阅help(unzip).所以要做你上面画出的你需要的东西

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

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

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

压缩(.z)或gzipped(.gz)或bzip2ed(.bz2)文件只是文件和您可以直接从连接读取的文件.所以让数据提供者使用它:)

  • 请参阅`help(gzfile)` - 我当时认为gzip协议现在可以解压缩(旧的).z文件,因为专利已经过期了.它可能不会.谁使用.z呢?20世纪80年代打电话,他们想要压缩他们;-) (3认同)
  • 您还需要关闭连接。R一次只能打开125个。类似 con &lt;- unz(temp, "a1.dat"); 数据 &lt;- read.table(con); 关闭(con); (2认同)

Geo*_*tas 27

为了记录,我尝试将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)
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`scan()`; 你可以直接在连接上使用`read.table()`等.看我编辑的答案, (5认同)

小智 17

我在http://cran.r-project.org/web/packages/downloader/index.html上使用了CRAN软件包"downloader" .更容易.

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./")
Run Code Online (Sandbox Code Playgroud)

  • 我只使用utils :: unzip对我来说不需要downlaoder软件包 (2认同)

Tom*_*ers 9

使用library(archive)它还可以读取存档中的特定 csv 文件,而无需先解压缩;read_csv(archive_read("http://www.newcl.org/data/zipfiles/a1.zip", file = 1), col_types = cols()) 我发现这更方便而且更快。

它还支持所有主要的存档格式,并且比基本的 R untar 或 unz 快得多 - 它支持 tar、ZIP、7-zip、RAR、CAB、gzip、bzip2、compress、lzma、xz 和 uuencoded 文件。

解压所有可以使用的东西archive_extract("http://www.newcl.org/data/zipfiles/a1.zip", dir=XXX)

这适用于所有平台,并且考虑到对我来说优越的性能将是首选。


dnl*_*rky 7

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

如果zip压缩包中包含一个单一的文件,你可以使用bash命令funzip,与一起选择freaddata.table包:

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

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

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


小智 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)
Run Code Online (Sandbox Code Playgroud)

我知道这在一行中是可能的,因为您可以将 bash 脚本fread传递到fread.


小智 5

这是一个示例,适用于无法使用该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))
Run Code Online (Sandbox Code Playgroud)